Mysql 使用group by返回具有max()的行
我试图获取其item_id存在于数组中且具有较高num的项(arr_items)Mysql 使用group by返回具有max()的行,mysql,join,group-by,inner-join,Mysql,Join,Group By,Inner Join,我试图获取其item_id存在于数组中且具有较高num的项(arr_items) player_id | item_id | num | unique_number ----------------------------------------- 10 | 1 | 1 | 1 10 | 1 | 11 | 2 10 | 1 | 93 | 3 10 | 2
player_id | item_id | num | unique_number
-----------------------------------------
10 | 1 | 1 | 1
10 | 1 | 11 | 2
10 | 1 | 93 | 3
10 | 2 | 24 | 4
10 | 2 | 40 | 5
预期的结果是获得数量为93的项目_id 1,以及数量为40的项目_id 2
下面的查询不返回任何结果。如果我删除num中的max
,它会工作,但不会返回具有最高num的item\u id。假设arr\u items=[1,2]
SELECT a.player_id, a.item_id, a.num, a.unique_number
FROM my_table a
INNER JOIN
(
SELECT player_id, item_id, max(num) AS max_num, unique_number
FROM my_table
WHERE
player_id = 10
AND item_id IN (arr_items)
GROUP BY item_id
) b ON a.item_id = b.item_id AND
a.player_id = b.player_id AND
a.num = b.max_num AND
a.unique_number = b.unique_number
;
编辑:
如果我从ON子句中删除unique\u number
,上面的查询可以正常工作,但我不太明白为什么。我还注意到,如果我有唯一的item_id,那么它与on子句中的unique_number字段一起工作
也就是说,如果我的桌子像下面这样,它就会工作。(项目id值已更改)
MySQL提供了一种使用group的非标准方式,遗憾的是,它“教会”了许多人相信分组就像从日志上掉下来一样简单,但不知何故它可以正确地猜测/解释所需逻辑的平衡。事实是,虽然分组很容易,但MySQL允许的奇怪的非标准语法并不总是正确的(结果是“近似值”),也不总是正确猜测 您可以轻松地修改现有查询以实现所需的功能,但请注意,您确实应该始终指定GROUPBY子句中的每个非聚合列
SELECT a.player_id, a.item_id, a.num, a.unique_number
FROM my_table a
INNER JOIN (
SELECT player_id, item_id, max(num) max_num
FROM my_table
GROUP BY player_id, item_id
) b ON a.item_id = b.item_id
AND a.player_id = b.player_id
AND a.num = b.max_num
;
将来,当MySQL实现窗口功能时,您将能够使用row\u number()
实现您想要的功能,并且效率也会提高一点:
select *
from (
select *
, row_number() over(partition by player_id, item_id
order by num DESC) as rn
from my_table
) d
where rn = 1
注意:第二个查询始终只会为每个
player\u id,item\u id
返回一行,但是如果根据player\u id,item\u id
对示例数据重复num=max(num),则上面的第一个查询可能会返回多行,您的查询似乎正常工作。我们遗漏了什么吗?嗯,的确。我所忽略的只是每件物品都有一个唯一的编号,如果没有它,它似乎工作得很好。我将编辑这个问题。虽然我不明白为什么它不能和它一起工作。@JohnJames“我不太明白为什么”。因为您没有正确地编写查询。在内部循环中,您的GROUP BY
甚至无效。您在选择中有玩家id
,物品id
,唯一编号
,但不在分组依据中。这没有道理。从您的示例中,对于player\u id=10
,如果它不在组中,那么哪个项目\u id
将被拾取?您的查询甚至不会在任何其他dbms中运行,除了可能的MYSql
@JohnJames如果您编写了一个正确的查询,您就会知道为什么包含unique\u number
不会起作用。@Eric所以基本上您是说我应该将GROUP BY item\u id
更改为GROUP BY item\u id,player\u id,unique\u number
?
select *
from (
select *
, row_number() over(partition by player_id, item_id
order by num DESC) as rn
from my_table
) d
where rn = 1