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

如何在不使用子查询的情况下修复此mysql查询?,mysql,Mysql,我有三张桌子。为了这个例子的目的,我将尽可能地简化它 第一个表包含电影ID和名称,第二个表包含流派ID和流派名称(动作、戏剧等)。第三个表存储与每部电影相关联的流派id,因为有些电影有多个流派id。它有两个栏目,流派id和电影id。简单的东西。我试图输出电影列表,以及与每部电影相关的类型列表 SELECT * FROM movies LEFT JOIN gen_pairs ON movies.mov_id = gen_pairs.gen_m

我有三张桌子。为了这个例子的目的,我将尽可能地简化它

第一个表包含电影ID和名称,第二个表包含流派ID和流派名称(动作、戏剧等)。第三个表存储与每部电影相关联的流派id,因为有些电影有多个流派id。它有两个栏目,流派id和电影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表中有多个类型。我如何让它为每部电影显示一个逗号分隔的类型列表,而不为每一项运行子查询?

您的选择应该构建笛卡尔乘积,因此您将得到如下输出

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。

更正:这将输出任何给定电影的所有类型,每行一个类型,为每个类型的对应类型重复电影名称。忘记GROUP BY子句。修好了,看来行得通。是否有办法从DB(cat_id)获取第二个参数,同时通过数组传递它们?您可以将另一个group_concat(c.cat_id)添加到选择列表中。除此之外,我不知道你的意思。