Du har ret. Uden grund, som jeg kan fatte, accepterer MySQL en tvetydig ORDER BY
så længe det navn, du angiver, ikke håndteres på nogen måde (ingen måde, jeg kunne komme i tanke om. Måske findes der andre).
Så snart det er tilfældet, bliver tvetydigheden afvist.
Dette er accepteret (og overflødigt):
select b.id, a.name as name
FROM client AS a JOIN client AS b ON (a.id = b.id)
ORDER BY name, name;
mens COALESCE(name, '')
, name IS NULL
, name OR NULL
er alle afvist.
Den oplagte løsning er at bruge et andet navn til aliaset, et som ikke vises i nogen af tabellerne.
En anden mulighed ville være at oprette en indlejret forespørgsel:
SELECT * FROM ( your query here, without ORDER ) AS original
ORDER BY IF($sortcol is NULL,1,0), $sortcol;
Det vil sige:
$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;