2012-03-23 140 views
0

我有一个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 

我可以得到这个工作,但它现在看起来真的很难看。有没有一个优雅的方式来做到这一点?

非常感谢!

+2

*“我能得到这个工作,” * ...你能告诉我们的代码,然后呢?没关系,如果这是一场灾难,但人们需要一个基准线:) – rdlowrey 2012-03-23 01:23:19

+0

是的,如果你显示代码 - 它更容易让我们更好地看起来更好,所以我们不必尝试重写已经存在的代码写.. – Justin 2012-03-23 01:25:58

+0

@rdlowrey - 好吧,我当前的代码选择*所有*的行,然后在PHP中(所以在查询后)我将所有行存储在数组中,按“值”值排序,然后循环并找到具有最低“值”值的每种类型的行。我希望能够在查询中完成所有这些工作? – Nate 2012-03-23 01:30:49

回答

3

这就是所谓的“最伟大的正每组”查询(即标签上,所以你会发现很多类似的问题,下)。 (我知道你想要“每组最低”,但这是同样的问题)。

通常情况下,你就能够做到:

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

但是这不会工作,如果你还想要name对应MIN(value)

要检索每type最低value相应的行,你加入你的表本身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 JOINmytable自己,限制连接,使所有的type是相同的。这将生成一个表格,其中包含每种类型的值的每种组合。
  • 我们向LEFT JOIN添加条件来限制值的组合,例如t1.value > t2.value。所以,现在我们有各类型中值的每一个组合表,但T1的比我的大T2的
  • ,因为这是一个LEFT JOIN,如果有一个t1.value对此有不小t2.value,相应t2列将为NULL。但这是恰恰是这个类型的最小t1.value
  • 添加WHERE t2.value IS NULL条件以准确挑出这些行。
0

SELECT type, name, MIN(value) as value FROM table GROUP BY type

+0

这不一定会为每个'type'选择与'MIN(value)'对应的'name'。 – 2012-03-23 01:28:14

+0

对,这只是一个简单的例子。 +1给你的答案 – Rob 2012-03-23 01:29:53

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