2016-10-20 8 views
0

Database Layout入れ子のGROUP_CONCAT MySQL?

私が提供した例のようなデータベースレイアウトがあります。上記の例では、ムービーは言語でリリースされていますが、ムービーには異なる劇場での劇場公開もあります。

ここで、すべての映画の劇場リリースとすべてのmovie_releasesを取得するためにデータベースにクエリを実行するにはどうすればよいですか?

私が持っている現在のコードは次のとおりです。

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

を調整する必要がdelimiteresを追加します。 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 

あなただけのデータセットせずに、結果セットはロリポップなしスティックのようなものですCONCATGROUP_CONCAT