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;

私の目的は、character_idのリストがすべてこのgame_idに存在する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

あなたが探している人のリストを知っているので、あなたが私が知っているカウントの#3を得ることができるとは思いません。

于 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 に答える