Je hebt gelijk. Zonder enige reden die ik kan doorgronden, MySQL aanvaardt een dubbelzinnige ORDER BY
zolang de naam die u opgeeft op geen enkele manier wordt behandeld (op geen enkele manier die ik kon bedenken. Misschien bestaan er nog andere).
Zodra dat het geval is, wordt ambiguïteit afgewezen.
Dit wordt geaccepteerd (en overbodig):
select b.id, a.name as name
FROM client AS a JOIN client AS b ON (a.id = b.id)
ORDER BY name, name;
while COALESCE(name, '')
, name IS NULL
, name OR NULL
worden allemaal afgewezen.
De voor de hand liggende oplossing is om een andere naam voor de alias te gebruiken, een naam die in geen van beide tabellen voorkomt.
Een andere mogelijkheid is om een geneste zoekopdracht te maken:
SELECT * FROM ( your query here, without ORDER ) AS original
ORDER BY IF($sortcol is NULL,1,0), $sortcol;
Dat is:
$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;