Masz rację. Bez powodu, który mógłbym pojąć, MySQL akceptuje niejednoznaczny ORDER BY
tak długo, jak podana nazwa nie jest w żaden sposób obsługiwana (nie mogłem sobie wyobrazić. Może istnieją inne).
Gdy tylko jest, dwuznaczność zostaje odrzucona.
Jest to akceptowane (i zbędne):
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
wszystkie są odrzucane.
Oczywistym rozwiązaniem jest użycie innej nazwy dla aliasu, takiej, która nie pojawia się w żadnej tabeli.
Inną możliwością byłoby utworzenie zagnieżdżonego zapytania:
SELECT * FROM ( your query here, without ORDER ) AS original
ORDER BY IF($sortcol is NULL,1,0), $sortcol;
To znaczy:
$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;