我正在尝试获取他们的item_id存在于数组(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
预期的结果是使用num 93获取item_id 1,使用num 40获取item_id 2。
以下查询不返回任何结果。如果我删除num中的max
,它可以工作,但不会返回具有最高num的item_id。假设arr_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_number
但上面的查询工作正常,但我不太明白为什么。我还注意到,如果我有唯一的item_ids,那么它与on子句中的unique_number字段一起使用。
如果我的表格如下所示,那就行了。 (item_id值已更改)
player_id | item_id | num | unique_number
-----------------------------------------
10 | 0 | 1 | 1
10 | 1 | 11 | 2
10 | 2 | 93 | 3
10 | 3 | 24 | 4
10 | 4 | 40 | 5
答案 0 :(得分:1)
MySQL提供了一种非标准的使用组的方式,令人遗憾的是,#34;教授"许多人认为分组就像从日志中掉落一样简单,但不知怎的,它可以正确地猜测/解释所需逻辑的平衡。事实是,虽然分组很容易,但是MySQL允许的奇怪的非标准语法并不总是正确的(结果是"逼近")并且并不总是正确猜测。
您可以轻松修改现有查询以满足您的需求,但请注意,您确实应始终在group by子句中指定每个非聚合列。
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_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
nb:第二个查询将始终每player_id, item_id
返回一行,但上面的第一个查询可能会返回多行IF num = max(num)重复player_id, item_id