无法为包含max()的查询获取正确的列值

时间:2016-10-25 08:24:00

标签: mysql sql

我有一组数据,如:

Nm | item | type | value 
21 | 19   |  A   | 15
22 | 40   |  B   | 10
21 | 20   |  A   | 80 
32 | 40   |  C   | 40

我尝试了几个查询,我总是得到:(对于记录Nm = 21)

Nm | item | type | max(value) 
21 | 19   |  A   | 80

这不是我想要的,因为最大值来自item = 20

6 个答案:

答案 0 :(得分:2)

 select 
    * from table t1 where nm=21
    order by value desc
    limit 1

答案 1 :(得分:1)

您需要找到特定nm具有最大值的行。为此,您需要查找每个nm并在子查询中查找最大值,然后将该最大值与主查询进行比较。

<强>查询:

select *
from item_table it_o
where it_o.value in 
(select max(value)
 from item_table it_i
 where it_i.nm=it_o.nm)

<强>输出:

nm  item    type    value
22  40      B   10
21  20      A   80
32  40     C    40

答案 2 :(得分:1)

SELECT Nm, item, type, value
  FROM ( SELECT Nm, MAX( value ) AS value 
          FROM YourTable 
         GROUP 
            BY Nm ) AS m
       NATURAL JOIN YourTable
 WHERE Nm = 21;

我被要求提供解释,所以这里是:

首先,您需要找到最大值(您还没有给出表名,因此我将使用YourTable):

SELECT MAX( value ) AS value
  FROM YourTable 
 WHERE item = 21

其次,您希望将需要加入上表格表达式的所有属性投影回YourTable,但我们无法做到这一点,因为我们还没有预测Nm属性。

我们很容易认为我们可以简单地投射属性:

SELECT Nm, MAX( value ) AS value
  FROM YourTable 
 WHERE item = 21

然而,这使得SQL barf。为了让SQL开心,我们必须使用SQL相当笨重的GROUP BY语法来说明我们总结的列(无论它有多么明显!):

SELECT Nm, MAX( value ) AS value
  FROM YourTable 
 WHERE item = 21
 GROUP
    BY Nm

现在我们可以加入YourTable,但事情并非如此简单:

SELECT Nm, item, type, value
  FROM ( SELECT Nm, MAX( value ) AS value 
          FROM YourTable 
         WHERE Nm = 21
         GROUP
            BY Nm )
       NATURAL JOIN YourTable;

再次,SQL barfs因为我们没有给我们的派生表一个名字。现在您可能想知道,如果我们使用NATURAL JOIN,给它起一个名字有什么意义,其中一个优点是INNER JOIN,我们不需要范围变量?嗯,没有必要,这是不需要的。但是,SQL标准声明它是必需的。因此,我们被迫包括一个名称,尽管它是:

SELECT Nm, item, type, value
  FROM ( SELECT Nm, MAX( value ) AS value 
           FROM YourTable 
          WHERE Nm = 21
          GROUP
             BY Nm ) AS pointless_name
       NATURAL JOIN YourTable;

注意我上面的SQL代码是不同的:一个人应用了一个经验来改变查询的结构,使其通常更有用(对不起,我没有超出直觉的解释!)

答案 3 :(得分:1)

你必须做order by item desc所以最大值先来,然后通过limit 1

只选择一行
SELECT * FROM TABLE ORDER BY VALUE DESC LIMIT 1

或者您可以在子查询中选择max id并在主查询中选择该id(此查询可以返回多行)

SELECT * FROM TABLE WHERE VALUE IN (SELECT MAX(VALUE) FROM TABLE)

答案 4 :(得分:0)

SELECT a.*
  FROM YourTable a
  JOIN 
     ( SELECT nm
            , MAX(value) value
         FROM YourTable 
        GROUP  
           BY nm
     ) b
    ON b.nm = a.nm
   AND b.value = a.value 

答案 5 :(得分:0)

您可以尝试这样

select * from tablename where value = (SELECT  MAX(value) FROM tablename )

OR

select top 1 * from tablename order by value desc