如何根据两列值选择行?

时间:2012-03-23 01:22:54

标签: php mysql

我的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

我可以让它发挥作用,但它现在看起来非常非常丑陋。是否有一种优雅的方式来做到这一点?

非常感谢!

3 个答案:

答案 0 :(得分:3)

这称为“每组最大n次”查询(在该标签下,你会发现很多类似的问题)。 (我知道你想要“每组最低n组”,但这也是同样的问题)。

通常,您可以这样做:

SELECT type, MIN(value)
FROM mytable
GROUP BY type

但如果您还希望与name对应的MIN(value),则无效。

要检索相应行的最小valuetype ,您可以在type GROUP BY内将您的表格加入到自身中变量,并在valueMIN)变量上具有排序条件:

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