2013-01-25 2 views
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_ids의 목록이 모든 GAME_ID에 존재되는 GAME_ID를 얻는 것입니다.

데이터의 설정 예 :

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

의 내가 character_id 1, 2를 가지고 어디 GAME_ID을 얻고 싶은 말을하자, 그리고 3. 어떻게 효율적인 쿼리를 만드는 방법에 대한 갈 것이라고? 내가 지금까지 가지고있는 최고의 아이디어는 여러 번 테이블에 합류하고 있었지만 이것을하기위한 더 좋은 방법이 있어야한다고 생각한다.

감사

편집 : 이것은 가장 좋은 쿼리 시간 증명으로 내가 사용하는 최종 솔루션이었다 호기심 사람을 위해 :

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
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 당신이 찾고있는 사람들의 목록을 알고 있기 때문에 당신이 알고있는 카운트를 위해.

+0

GAME_ID – MasterGberry

+0

에서 중복 character_ids이 될 수 있다면 나는 GAME_ID – MasterGberry

+1

서로 각 character_id를 분리 할 세 번째 열라고 player_id을 추가 한 것을 다음 선택'(하위이 같은 선택으로의 수정 별개의 character_id, game_Characters'의 game_ID) 위의 game_Characters 바꾸기 – xQbert

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; 
관련 문제