2009-02-26 2 views
0

3 개의 테이블이 있습니다. 이 예제의 목적을 위해 최대한 단순화 할 것입니다.하위 쿼리를 사용하지 않고이 mysql 쿼리를 어떻게 수정합니까?

첫 번째 테이블에는 영화 ID와 이름이 포함되고 두 번째 테이블에는 장르 ID 및 장르 이름 (액션, 드라마 등)이 포함됩니다. 세 번째 테이블에는 각 영화와 연결된 장르 ID가 저장됩니다. 일부 영화에는 둘 이상의 영화가 있기 때문입니다. 여기에는 genre_id와 movie_id의 2 개의 열이 있습니다. 요정 간단한 물건. 각 영화와 관련된 장르 목록과 함께 영화 목록을 출력하려고합니다.

SELECT * 
     FROM movies 
     LEFT JOIN gen_pairs 
     ON movies.mov_id = gen_pairs.gen_movieid 
     LEFT JOIN categories 
     ON gen_pairs.gen_catid = categories.cat_id 
    GROUP BY mov_id 

gen_pairs 테이블에 여러 장르가있는 경우에도 분명히 각 영화의 단일 장르를 출력합니다. 각 항목에 대한 하위 쿼리를 실행하지 않고 각 영화에 대한 쉼표로 구분 된 쟝르 목록을 표시하려면 어떻게해야합니까?

+0

수정 : 주어진 영화에 대해 * ALL * 장르를 출력합니다. 각 장르별 장르는 해당 장르의 영화 이름을 반복합니다. – vladr

+0

GROUP BY 절을 잊어 버렸습니다. 결정된. –

답변

1

당신이 대신 원하는처럼 당신이

MovieA GenreA 
MovieA GenreB 
MovieB GenreA 
... 

같은 출력을 얻을 수 있습니다 그러나 소리, 그래서 데카르트의 제품을 구축해야 선택 :

MovieA GenreA, GenreB 
MovieB GenreA 
... 

MySQL이 무엇을 할 수있는 GROUP_CONCAT 기능이 있습니다 원하는 :

SELECT m.mov_id, GROUP_CONCAT(c.name) 
     FROM movies m 
    LEFT JOIN gen_pairs gp ON (m.mov_id = gp.gen_movieid) 
    LEFT JOIN categories c ON (gp.gen_catid = c.cat_id) 
    GROUP BY m.mov_id 

GROUP_CONCAT 및 GROUP BY에 유의하십시오.

+0

그게 효과가있는 것 같습니다. DB (cat_id)에서 두 번째 매개 변수를 가져 와서 배열을 통해 동시에 전달할 수 있습니까? –

+0

다른 그룹 _concat (c.cat_id)을 선택 목록에 추가 할 수 있습니다. 그 외에는 무슨 뜻인지 확실치 않습니다. – derobert

관련 문제