Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Classificando os Nulos por último


Você tem razão. Por nenhuma razão que eu possa entender, o MySQL aceita um ORDER BY ambíguo contanto que o nome fornecido não seja tratado de forma alguma (de jeito nenhum que eu poderia pensar. Talvez existam outros).

Assim que é, a ambiguidade é rejeitada.

Isso é aceito (e redundante):
select b.id, a.name as name
    FROM client AS a JOIN client AS b ON (a.id = b.id)
    ORDER BY name, name;

enquanto COALESCE(name, '') , name IS NULL , name OR NULL são todos rejeitados.

A solução óbvia é usar um nome diferente para o alias, um que não apareça em nenhuma das tabelas.

Outra possibilidade seria criar uma consulta aninhada:
SELECT * FROM ( your query here, without ORDER ) AS original
ORDER BY IF($sortcol is NULL,1,0), $sortcol;

Aquilo é:
$sortcol="boat";
$sql = <<<SQL
   SELECT * FROM (
      SELECT fleet,b.boat as boat,owner FROM boats as b 
         LEFT JOIN owners as o ON  b.boat=o.boat 
   ) AS original
   ORDER BY IF($sortcol is NULL,1,0), $sortcol;
SQL;