Estás bien. Sin ninguna razón que pueda entender, MySQL acepta un ORDER BY
ambiguo siempre que el nombre que proporcione no se manipule de ninguna manera (De ninguna manera que se me ocurra. Tal vez existan otros).
Tan pronto como lo es, la ambigüedad se rechaza.
Esto es aceptado (y redundante):
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
son todos rechazados.
La solución obvia es usar un nombre diferente para el alias, uno que no aparezca en ninguna de las tablas.
Otra posibilidad sería crear una consulta anidada:
SELECT * FROM ( your query here, without ORDER ) AS original
ORDER BY IF($sortcol is NULL,1,0), $sortcol;
Eso es:
$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;