2016-10-20 8 views
0

Database LayoutВложенный GROUP_CONCAT MySQL?

Хорошо, скажем, у меня есть макет базы данных, подобный той, что приведен в примере, который я предоставил. В приведенных выше примерах фильмы имеют выпуски на языках, и эти фильмы также имеют театральные релизы в разных театрах.

Теперь, если бы я хотел запросить базу данных, чтобы получить все выпуски кинотеатра, а также все видеоролики, как мне это сделать?

Текущий код у меня есть:

select 
     GROUP_CONCAT(movie.name, ",", language.lang, ",", GROUP_CONCAT(theatre.name)) as releases 
from 
    movie 
     left join movie_releases on movie_releases.movie_id = movie.id 
     left join language on movie_release.language_id = language.id 
     left join theatre_release on theatre_release.movie_release_id = movie_release.id 
     left join theatre on theatre.id = theatre_release.theatre_id 

Очевидно, что это не работает, потому что вы не можете вкладывать GROUP_CONCAT функции, как это.

Мой желаемый результат будет что-то вроде

["Spiderman", "English", ["Cinema Theatre", "Garden Cinemas"]] 
["Spiderman", "Spanish", ["El Cine Grande"]] 
["Batman", "English", ["Town Movies"]] 
+0

без набора данных, как палка без леденца. См. Http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-query – Strawberry

+1

@Strawberry Спасибо за то, что вы вообще не помогли. – user2827048

ответ

1
SELECT 
    CONCAT(
     '["', `movie`.`name`, '"', 
     ', ', 
     '"', releases.lang, '"', 
     ', [', 
     releases.theatres, 
     ']]' 
    ) AS `release` 
FROM 
    movie 
LEFT JOIN (
    SELECT 
     movie_id, 
     `language`.lang, 
     GROUP_CONCAT('"', theatre.`name`, '"') AS theatres 
    FROM 
     movie_release 
    LEFT JOIN theatre_release ON theatre_release.movie_release_id = movie_release.id 
    LEFT JOIN theatre ON theatre.id = theatre_release.theatre_id 
    LEFT JOIN `language` ON `language`.id = movie_release.language_id 
    GROUP BY 
     movie_id, 
     language_id 
) AS releases ON releases.movie_id = movie.id 

Вы можете сгруппировать театры в подзапрос, а затем присоединиться к ним на кинофильмах их отношением над выпусками.

Привлечение данных в ваш формат может сделать запрос немного сложнее для чтения. Итак, вот запрос без причудливого форматирования.

SELECT 
    CONCAT(
     `movie`.`name`, 
     ' ', 
     releases.lang, 
     ' ', 
     releases.theatres 
    ) AS `release` 
FROM 
    movie 
LEFT JOIN (
    SELECT 
     movie_id, 
     `language`.lang, 
     GROUP_CONCAT(theatre.`name`) AS theatres 
    FROM 
     movie_release 
    LEFT JOIN theatre_release ON theatre_release.movie_release_id = movie_release.id 
    LEFT JOIN theatre ON theatre.id = theatre_release.theatre_id 
    LEFT JOIN `language` ON `language`.id = movie_release.language_id 
    GROUP BY 
     movie_id, 
     language_id 
) AS releases ON releases.movie_id = movie.id 

Чтобы добавить delimiteres у вас есть только для регулировки результирующего набора CONCAT или GROUP_CONCAT