我想得到
id a b c
--------------------
1 1 100 90
6 2 50 100
...来自:
id a b c
--------------------
1 1 100 90
2 1 300 50
3 1 200 20
4 2 200 30
5 2 300 70
6 2 50 100
它是被 a 分组的 b 最小的行。
用sql怎么做?
编辑
我以为可以通过
select * from table group by a having min(b);
后来发现不对
但是可以用 having
语句来实现吗?
我正在使用 MySQL
最佳答案
SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON (t1.a=t2.a AND t1.b>t2.b)
WHERE t2.a IS NULL;
这是可行的,因为不应该有具有相同 a
和较小的 b
的匹配行 t2
。
更新:这个解决方案与其他人已经确定的关系有同样的问题。但是,我们可以打破联系:
SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2
ON (t1.a=t2.a AND (t1.b>t2.b OR t1.b=t2.b AND t1.id>t2.id))
WHERE t2.a IS NULL;
假设在平局的情况下,具有较低 id
的行应该是我们选择的行。
这并不能解决问题:
select * from table group by a having min(b);
因为 HAVING MIN(b)
只测试组中的最小值不为假(在 MySQL 中意味着不为零)。 HAVING
子句中的条件用于从结果中排除组,而不是用于选择要返回的组中的行。
关于sql问题,挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1960621/