这个问题在这里已有答案:
我有一个名为source
的(简化)表:
game_index int,
rating int,
attributes varchar(42)
现在我正在寻找一个选择命令,它可以为每个游戏(rating
)提取前3个记录(game_index
)。我想将结果存储到另一个表(称为max
,相同的表格布局)。因此可以使用多个SQL命令。
没有game_index
很容易:
INSERT INTO max
SELECT * FROM source
ORDER BY rating DESC LIMIT 3
如何将它与GROUP BY game_index
结合?有任何想法吗?
可以使用其他表成员或临时表。
在MySQL 8+中,您可以:
INSERT INTO max (. . . ) -- list the columns here
SELECT . . . -- list the columns here
FROM (SELECT s.*,
ROW_NUMBER() OVER (PARTITION BY game_index ORDER BY rating DESC) as seqnum
FROM source s
) s
WHERE seqnum <= 3;
这在早期版本中更难。如果rating
是唯一的,那么有效的方法是:
INSERT INTO max ( . . . ) -- list columns here
SELECT . . .
FROM source s
WHERE s.rating >= ANY (SELECT s2.rating
FROM source s2
WHERE s2.game_index = s.game_index
ORDER BY s2.rating DESC
LIMIT 1 OFFSET 2
);