MySQL里的选出分组极值行

来源:互联网 发布:三国杀神武将排名知乎 编辑:程序博客网 时间:2024/05/22 02:28

应用需要从大表中选出每个分组中含有某列最大值的那行,很自然写出如下查询:

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"


(From: http://stackoverflow.com/questions/121387/fetch-the-row-which-has-the-max-value-for-a-column)