Mysql
 sql >> Base de données >  >> RDS >> Mysql

Trier les valeurs nulles en dernier

Tu as raison. Sans aucune raison que je puisse imaginer, MySQL accepte un ORDER BY ambigu tant que le nom que vous fournissez n'est pas traité de quelque manière que ce soit (pas moyen que je puisse penser. Peut-être que d'autres existent).

Dès qu'elle l'est, l'ambiguïté est rejetée.

Ceci est accepté (et redondant) :

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

tandis que COALESCE(name, '') , name IS NULL , name OR NULL sont tous rejetés.

La solution évidente consiste à utiliser un nom différent pour l'alias, un nom qui n'apparaît dans aucune des deux tables.

Une autre possibilité serait de créer une requête imbriquée :

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

C'est-à-dire :

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