如何在不使用子查询的情况下修复此mysql查询?

时间:2009-02-26 06:30:08

标签: mysql

我有3张桌子。出于本示例的目的,我将尽可能地简化它。

第一个表包含电影ID和名称,第二个表包含流派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表中有多个。如何为每部电影显示逗号分隔的流派列表,而不对每个项目运行子查询?

1 个答案:

答案 0 :(得分: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。