Você tem razão. Por nenhuma razão que eu possa entender, o MySQL aceita um
ORDER BY
ambíguo contanto que o nome fornecido não seja tratado de forma alguma (de jeito nenhum que eu poderia pensar. Talvez existam outros). Assim que é, a ambiguidade é rejeitada.
Isso é aceito (e 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;
enquanto
COALESCE(name, '')
, name IS NULL
, name OR NULL
são todos rejeitados. A solução óbvia é usar um nome diferente para o alias, um que não apareça em nenhuma das tabelas.
Outra possibilidade seria criar uma consulta aninhada:
SELECT * FROM ( your query here, without ORDER ) AS original
ORDER BY IF($sortcol is NULL,1,0), $sortcol;
Aquilo é:
$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;