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"
- MySQL里的选出分组极值行
- MySQL选出指定数量的字符SUBSTRING_INDEX
- mysql选出 user中mobile相同(相同数量>1)的行
- jsp里的分组显示
- 从表1里选出和表2里条件相等以外的数据
- Mysql的数据分组
- mysql的分组查询、分组统计
- 【C语言】两条线段里选出比较长的(结构体)
- 选出最大的数
- PHP里的正则表达式分组
- 多元函数的极值及条件极值
- 如何从excel的多行中随机选出n行
- mysql cluster 的分组问题
- mysql分组后的总数
- MySql排序分组的方法
- 关于mysql分组的探索
- 多元函数的极值
- int的极值
- 第3章练习题--2--八进制到十进制--2735
- 深入Bash___调试
- POJ-2626 DP
- 时钟类---swing画图、Timer、JFrame用法示例
- 第3章练习题--3--二进制转换为十六进制--2798
- MySQL里的选出分组极值行
- Swing组件
- HTML 5的革新:结构之美
- php脱裤脚本
- bash变量赋值及字符串的操作
- 使用FCKeditor的惨痛教训!网页制作千万要标准啊!
- Eclipse Subclipse
- 如何更深层的识别用户的需求
- VisualSVN+Eclipse搭建代码控管应用