应用需要从大表中选出每个分组中含有某列最大值的那行,很自然写出如下查询:
SELECT g1, f1, max(f2) FROM t1 GROUP BY g1;
后来经网络上一查,确实另外也有人也这么问这么答了,心中窃道“英雄所见”。
后来由于MySQL的一个bug,改用SQL Server测试,才发现这么好用的一条语句竟然不被允许!
心中纳闷,一查才知道,好像说这也算是MySQL的一点宽容扩展,SQL标准是不赞同这么干的——只有分组字段才适合同聚集函数一起被SELECT出来。
后来越想越觉得对结果不放心——到底是不是真能选出最大的那行?
于是自己做个小测试验证一下:
CREATE TABLE t(id int, f1 int, a1 int);
INSERT INTO t VALUES (1, 1, 1), (1, 2, 2), (1, 3, 3), (2, 3, 3), (2, 4, 4), (2, 2, 2);
SELECT * FROM t;
SELECT id, f1, max(a1) FROM t GROUP BY id;
猜猜结果是什么?
才知道自己错得有多离谱!!!
===========================================
A very smart solution suggested by Bill Karwin:
SELECT t1.*
FROM t AS t1
LEFT OUTER JOIN t AS t2
ON (t1.id = t2.id AND t1.a1 < t2.a1)
WHERE t2.id IS NULL;
In other words: fetch the row from t1 where no other row exists with the same "id" and a greater "a1"