我有一个名为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
结合?
有什么想法吗?
可以有其他表成员或临时表。
答案 0 :(得分:1)
在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
);