我的MySQL表格结构有点像这样:
type name value
=====================
1 item1 1
1 item2 20
2 item3 0
3 item4 5
3 item5 2
3 item6 50
我需要编写一个查询,返回每个类型的最低值项,按值排序。所以结果应该是:
type name value
=====================
2 item3 0
1 item1 1
3 item5 2
我可以让它发挥作用,但它现在看起来非常非常丑陋。是否有一种优雅的方式来做到这一点?
非常感谢!
答案 0 :(得分:3)
这称为“每组最大n次”查询(在该标签下,你会发现很多类似的问题)。 (我知道你想要“每组最低n组”,但这也是同样的问题)。
通常,您可以这样做:
SELECT type, MIN(value)
FROM mytable
GROUP BY type
但如果您还希望与name
对应的MIN(value)
,则无效。
要检索相应行的最小value
每type
和 ,您可以在type
GROUP BY
内将您的表格加入到自身中变量,并在value
(MIN
)变量上具有排序条件:
SELECT t1.type, t1.name, t1.value
FROM mytable t1
LEFT JOIN mytable t2 ON t1.type = t2.type AND t1.value > t2.value
WHERE t2.value IS NULL
注意:
LEFT JOIN
mytable
自身,限制联接,使所有type
都相同。这将生成一个表格,其中包含每种类型的每种值组合。LEFT JOIN
添加条件,以限制值t1.value > t2.value
的组合。所以现在我们有一个表格,其中包含每种类型中每种值的组合,但t1大于t2的LEFT JOIN
,如果有t1.value
没有更小的 t2.value
,相应的t2
列将会是NULL。但这正是该类型的最小t1.value
!WHERE t2.value IS NULL
条件以准确挑选这些行。答案 1 :(得分:0)
SELECT type, name, MIN(value) as value FROM table GROUP BY type
答案 2 :(得分:0)
编辑3: 以下是按类型而不是名称重新分组的查询。
select type, name, min(value) from (select, type, name, value from Table order by value asc) group by type
这个可能有用,但我不确定。见下文。伙计,这真是一团糟。
select type, name, min(value) from Table group by type order by value asc
编辑2: 对不起,我读错了。你可以忽略这个答案
我需要仔细检查一下。不记得订单是否会使它如此选择正确的类型。
select type, name, min(value) from Table group by name order by value asc
编辑: 我在我的一个数据集上测试了一个类似的查询,它似乎工作。但我不能肯定地说,因为我只是按照分组后的顺序阅读该命令。
那么另一种选择就是:
select type, name, min(value) from (select, type, name, value from Table order by value asc) group by name