Bạn đúng. Không có lý do gì mà tôi có thể hiểu được, MySQL chấp nhận ORDER BY
không rõ ràng miễn là tên bạn cung cấp không được xử lý theo bất kỳ cách nào (không có cách nào mà tôi có thể nghĩ ra. Có thể những người khác tồn tại).
Ngay sau đó, sự không rõ ràng sẽ bị từ chối.
Điều này được chấp nhận (và thừa):
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
tất cả đều bị từ chối.
Giải pháp rõ ràng là sử dụng một tên khác cho bí danh, một tên không xuất hiện trong cả hai bảng.
Một khả năng khác là tạo một truy vấn lồng nhau:
SELECT * FROM ( your query here, without ORDER ) AS original
ORDER BY IF($sortcol is NULL,1,0), $sortcol;
Đó là:
$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;