Mysql 使用group by返回具有max()的行

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

我试图获取其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    |  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