Mysql
 sql >> Database >  >> RDS >> Mysql

Ordinamento nulli per ultimi

Hai ragione. Per nessun motivo che io possa capire, MySQL accetta un ambiguo ORDER BY purché il nome che fornisci non venga gestito in alcun modo (in nessun modo mi viene in mente. Forse ne esistono altri).

Non appena lo è, l'ambiguità viene respinta.

Questo è accettato (e ridondante):

select b.id, a.name as name
    FROM client AS a JOIN client AS b ON (a.id = b.id)
    ORDER BY name, name;

mentre COALESCE(name, '') , name IS NULL , name OR NULL sono tutti rifiutati.

La soluzione ovvia è usare un nome diverso per l'alias, uno che non appare in nessuna delle tabelle.

Un'altra possibilità sarebbe quella di creare una query nidificata:

SELECT * FROM ( your query here, without ORDER ) AS original
ORDER BY IF($sortcol is NULL,1,0), $sortcol;

Cioè:

$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;