Du har rätt. Utan någon anledning som jag kan förstå, accepterar MySQL en tvetydig ORDER BY
så länge namnet du anger inte hanteras på något sätt (inget sätt som jag kunde komma på. Kanske finns det andra).
Så fort det är så avvisas tvetydigheten.
Detta accepteras (och överflö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;
medan COALESCE(name, '')
, name IS NULL
, name OR NULL
alla avvisas.
Den uppenbara lösningen är att använda ett annat namn för aliaset, ett som inte visas i någon av tabellen.
En annan möjlighet skulle vara att skapa en kapslad fråga:
SELECT * FROM ( your query here, without ORDER ) AS original
ORDER BY IF($sortcol is NULL,1,0), $sortcol;
Det vill säga:
$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;