由於MySQL Extensions to GROUP BY
下記載:
在標準的SQL,包括GROUP BY
子句不能引用非聚合列在未在GROUP BY
子句中命名的選擇列表中的查詢。例如,因爲在選擇列表中的name
列沒有出現在GROUP BY
這個查詢是標準的SQL違法:
SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o, customers AS c
WHERE o.custid = c.custid
GROUP BY o.custid;
對於查詢是合法的,在name
列必須從選擇列表中被省略或在GROUP BY
條款中命名。
MySQL擴展了GROUP BY
的使用,以便選擇列表可以引用未在GROUP BY
子句中指定的非聚集列。這意味着前面的查詢在MySQL中是合法的。您可以使用此功能通過避免不必要的列排序和分組來獲得更好的性能。但是,這對於每個組中未在GROUP BY
中指定的每個非聚集列中的所有值都是相同的情況都很有用。服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選值是不確定的。此外,每個組的值的選擇不能通過添加ORDER BY
子句來影響。結果集的排序在選擇值後發生,並且ORDER BY
不影響服務器選擇的每個組內的哪些值。
在一般情況下,我們需要使用一個子查詢找到marks
最大值,然後用它來獲得最大記錄的其他列:
SELECT *
FROM umer
WHERE marks = (
SELECT MAX(marks)
FROM umer
WHERE city != 'NewYork'
)
或者,使用自聯接:
SELECT *
FROM umer NATURAL JOIN (
SELECT MAX(marks) marks
FROM umer
WHERE city != 'NewYork'
) t
上述兩種方法將返回所有記錄有最大標誌。如果你只想要一個這樣的紀錄,您只需將過濾記錄進行排序和限制結果:
SELECT *
FROM umer
WHERE city != 'NewYork'
ORDER BY marks DESC
LIMIT 1
看到他們sqlfiddle。
那麼,爲什麼我收到了'城市= 「NEWYORK」'正確的結果? – Naruto
@Naruto:因爲它是「第一」行。因此,mysql爲「第一個」行返回'name'(其中「first」通常是如何將行實際存儲在磁盤上) – zerkms
ok,所以相同的邏輯對於'AVG,MIN,COUNT'等其他函數有效 – Naruto