Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Can';无法为包含max()的查询获取正确的列值_Mysql_Sql - Fatal编程技术网

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

Mysql Can';无法为包含max()的查询获取正确的列值,mysql,sql,Mysql,Sql,我有一组数据,如: Nm | item | type | value 21 | 19 | A | 15 22 | 40 | B | 10 21 | 20 | A | 80 32 | 40 | C | 40 我尝试了几个查询,我总是得到:(对于记录Nm=21) 这不是我想要的,因为最大值来自item=20,您需要找到对于特定nm具有最大值的行。为此,您需要查找每个nm并在子查询中找到最大值,然后将该最大值与主查询进行比较 select *

我有一组数据,如:

Nm | item | type | value 
21 | 19   |  A   | 15
22 | 40   |  B   | 10
21 | 20   |  A   | 80 
32 | 40   |  C   | 40
我尝试了几个查询,我总是得到:(对于记录Nm=21)


这不是我想要的,因为最大值来自item=20,您需要找到对于特定nm具有最大值的行。为此,您需要查找每个nm并在子查询中找到最大值,然后将该最大值与主查询进行比较

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

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
输出:

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
你可以这样试试

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

我被要求提供一个解释,因此:

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

第二,您希望将需要将上面的表表达式连接起来的所有属性投影回
YourTable
,但我们不能这样做,因为我们没有投影
Nm
属性

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

SELECT Nm, MAX( value ) AS value
  FROM YourTable 
 WHERE item = 21
然而,这使得SQL变得死气沉沉。为了让SQL满意,我们必须使用SQL相当笨拙的
groupby
语法说明我们总结的列(无论多么明显!):

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会死机,因为我们没有给派生表命名。现在您可能想知道,如果我们使用的是
自然连接
,那么给它起个名字有什么意义呢?它比
内部连接
的优势之一是我们不需要范围变量?嗯,没有意义,这是不必要的。但是,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代码是不同的:一个人应用自己的经验来更改查询的结构,使其通常更有用(对不起,我没有超出直觉之外的解释!)。

您必须执行
按项排序desc
所以最大值首先出现,然后通过执行
限制1

SELECT * FROM TABLE ORDER BY VALUE DESC LIMIT 1
或者,您可以在子查询中选择max id,并在主查询中选择该id(此查询可以返回多行)


记录Nm=21的预期输出是什么:项应该是20而不是19“我尝试了几个查询”。。。哪些是??当你甚至不告诉我们你离我们有多近的时候,我们很难帮助你,我们也不可能发现你的误解,这样我们就可以帮助你学习。另请看。我会帮你解决的。你能解释一下如果出现平局,你的两个问题会产生什么结果吗?我不认为它们完全相同。这是不等价的,第一个是首选的,如果您使用的是大量数据,第二个查询将导致性能问题,因为它交替使用两个查询,一个是sub,一个是main,我说得对,第一个查询只会返回一行,而第二个将返回具有关节最大值的所有行?另外,这个问题需要
MAX(value)
,因此您可以最大化
value
,而不是
item
/
id
。我没有理解您,请您解释一下:)如果有两行
value
=
80
,那么第一个查询将返回一行(由于
限制1
);第二个查询将返回两行。这个问题没有说明哪一个是必需的,所以最好同时提出这两个问题,并解释为什么其中一个是可以接受的答案。@TobySpeight:请仔细阅读我的解释。欢迎反馈:)这是一个非常好的答案!谢谢你的编辑。谢谢这是一个完美的任务查询,虽然它花了超过5分钟的时间来获取结果。谢谢。
SELECT Nm, item, type, value
  FROM ( SELECT Nm, MAX( value ) AS value 
          FROM YourTable 
         WHERE Nm = 21
         GROUP
            BY Nm )
       NATURAL JOIN YourTable;
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;
SELECT * FROM TABLE ORDER BY VALUE DESC LIMIT 1
SELECT * FROM TABLE WHERE VALUE IN (SELECT MAX(VALUE) FROM TABLE)