Sie haben Recht. Ohne Grund, den ich ergründen kann, akzeptiert MySQL ein zweideutiges ORDER BY
solange der von Ihnen angegebene Name in keiner Weise behandelt wird (Keine Möglichkeit, die ich mir vorstellen könnte. Vielleicht gibt es noch andere).
Sobald dies der Fall ist, wird Mehrdeutigkeit abgelehnt.
Dies ist akzeptiert (und überflüssig):
select b.id, a.name as name
FROM client AS a JOIN client AS b ON (a.id = b.id)
ORDER BY name, name;
während COALESCE(name, '')
, name IS NULL
, name OR NULL
werden alle abgelehnt.
Die offensichtliche Lösung besteht darin, einen anderen Namen für den Alias zu verwenden, einen, der in keiner der Tabellen erscheint.
Eine andere Möglichkeit wäre, eine verschachtelte Abfrage zu erstellen:
SELECT * FROM ( your query here, without ORDER ) AS original
ORDER BY IF($sortcol is NULL,1,0), $sortcol;
Das heißt:
$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;