3

我在mysql中有以下表设置:

CREATE TABLE `games_characters` (
  `game_id` int(11) DEFAULT NULL,
  `player_id` int(11) DEFAULT NULL,
  `character_id` int(11) DEFAULT NULL,
  KEY `game_id_key` (`game_id`),
  KEY `character_id_key` (`character_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我的目标是获得一个 game_id,其中 character_ids 的列表都存在于这个 game_id 中。

一组示例数据:

1, 1
1, 2
1, 3
2, 1
2, 2
3, 1
3, 4

假设我想获取 character_id 具有 1、2 和 3 的 game_id。我将如何进行有效的查询?到目前为止,我最好的想法是多次加入表格,但我认为必须有更好的方法来做到这一点。

谢谢

编辑:对于任何好奇的人,这是我使用的最终解决方案,因为它证明了最佳查询时间:

SELECT game_ID
FROM (
    SELECT DISTINCT character_ID, game_ID
    FROM games_Characters
) AS T
WHERE character_ID
IN ( 1, 2, 3 ) 
GROUP BY game_ID
HAVING COUNT( * ) =3
4

2 回答 2

4
Select game_ID from games_Characters
where character_ID in (1,2,3)
group by game_ID
having count(*) = 3

the above makes two assumptions
1) you know the characters your looking for
2) game_ID and character_ID are unique

我不认为你能得到我知道的排名第三的人,因为你知道你正在寻找的人的名单。

于 2013-01-25T04:19:29.163 回答
2

这个应该可以的。

select game_id
from games_characters
where character_id in (1,2,3)
group by game_id
having count(*) = 3

如果这对您来说不够动态,则需要添加更多步骤。

create temporary table character_ids(id int primary key);

insert into character_ids values (1),(2),(3);

select @count := count(*)
from character_ids;

select gc.game_id
from games_characters as gc
join character_ids as c
    on (gc.character_id = c.id)
group by gc.game_id
having count(*) = @count;
于 2013-01-25T04:22:41.950 回答