Как мне подойти к подобным запросам в MySQL, может быть, Group_Concat?

#mysql #sql

#mysql #sql

Вопрос:

База данных

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

Допустим, у меня есть следующая информация в моих таблицах

 movie
id        name
1         "Batman"
2         "Superman"

genre
id        name
1         "Thriller"
2         "Horror"

language  
id        lang
1         "English"
2         "Spanish"

theatre
id        name
1         "First Theatre"
2         "Second Theatre"

movie_genre
movie_id  genre_id
1         1
1         2
2         2

movie_release
id        language_id     movie_id
1         1               1
2         2               1
3         1               2

theatre_release
movie_release_id     theatre_id
1                    1
2                    2
3                    1
3                    2
  

И в идеале результат был бы примерно таким

 movie.name   genres             releases
"Batman"     "thriller, horror" English, Theatre One
                                Spanish, Theatre Two

"Spiderman"  "Horror"           Spanish, Theatre One, Theatre Two
  

моя попытка запроса

 Select
     movie.name
     Group_Concat(genre.name) as genres
     Group_concat(language.lang, group_concat(theatre.name)) as releases
from
    movie
    left join movie genre on movie.id = movie_genre.movie_id
    left join genre on genre.id = movie_genre.genre_id
    left join movie_release on movie_release.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_release.theatre_id = theatre.id
  

Комментарии:

1. Как вы сказали GROUP_CONCAT , это ответ. Вы пробовали что-нибудь

2. @Prdp да, я пытался выполнить групповое объединение, чтобы объединить все языки вместе, и групповое объединение внутри этого, чтобы сгруппировать все кинотеатры, в которых выпущен фильм на этом языке, но у вас не может быть вложенного группового объединения

3. Опубликуйте запрос, мы это исправим

4. @Prdp опубликовал мой запрос

5. SQL — это НЕ способ «красиво форматировать», ошибочно рассматривать его для такой задачи.

Ответ №1:

Вам не нужны вложенные GROUP_CONCAT .

Используйте CONCAT для объединения lang amp; name , затем добавьте GROUP_CONCAT , чтобы получить результат

 Select
     movie.name
     Group_Concat(genre.name) as genres
     GROUP_CONCAT(CONCAT(language.lang,' , ',theatre.name) SEPARATOR ' | ') as releases
from ...
  

Комментарии:

1. Это дало бы мне что-то вроде «(КАЖДЫЙ ЯЗЫК), (КАЖДЫЙ ТЕАТР)», что сделало бы невозможным увидеть, какой язык соответствует какому театру

2. @user2827048 — проверьте обновление .. может дать вам лучшее представление