Как вы исправите этот запрос MySQL без использования подзапроса? - PullRequest
0 голосов
/ 26 февраля 2009

у меня 3 таблицы. Для целей этого примера я максимально упросту его.

Первая таблица содержит идентификаторы и названия фильмов, вторая таблица содержит идентификаторы жанров и названия жанров (боевик, драма и т. Д.) В третьей таблице хранится идентификатор жанра, связанный с каждым фильмом, поскольку в некоторых фильмах их несколько. Он имеет 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 Ответ

1 голос
/ 26 февраля 2009

Ваш выбор должен построить декартово произведение, так что вы получите вывод как

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...