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;