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;