2009-02-26 17 views
0

私は3つのテーブルを持っています。この例の目的のために、私は可能な限り簡素化します。サブクエリを使用せずにこのmysqlクエリを修正するにはどうすればよいですか?

最初のテーブルには映画IDと名前が含まれ、2番目のテーブルにはジャンルIDとジャンル名(アクション、ドラマなど)が含まれます。 3番目のテーブルには、複数の映画があるため、各映画に関連付けられたジャンルIDが格納されます。それは2列、genre_idとmovie_idを持っています。妖精の単純なもの。私はムービーのリストを各ムービーに関連付けられたジャンルのリストと共に出力しようとしています。

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 *ジャンルを、1つの行につき1つのジャンルに出力し、後者の対応するジャンルごとに映画の名前を繰り返します。 – 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)から2番目のパラメータを取得し、同時にそれらを配列に渡す方法はありますか? –

+0

別のgroup_concat(c.cat_id)を選択リストに追加することができます。それ以外は、あなたが何を意味するか分からない。 – derobert

関連する問題