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)