mysql - 嵌套 GROUP_CONCAT MySQL?

标签 mysql

Database Layout

好吧,假设我有一个类似于我提供的示例中的数据库布局。在上面的示例中,电影有多种语言版本,而这些 movie_releases 也有不同影院的影院版本。

现在,如果我想查询数据库以获取电影的所有影院发行以及所有 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"]]

最佳答案

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

关于mysql - 嵌套 GROUP_CONCAT MySQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40146729/

相关文章:

mysql - 关系数据库 : DELETE versus "Mark for Deletion"

mysql - Golang GORM 使用 Lat 和 Lng 查询某个位置周围的位置

python - 如何使用 Python 在 AWS Lambda 上运行 SQLAlchemy

php - 使用 INSERT INTO SELECT 和 VALUES MYSQL PDO

php - 使用相同数组索引的不同值从 mysql 填充 php 数组

php - 当数据库出现故障或我想永久断开数据库连接时,如何将用户重定向到 404 页面?

php - 如何使用codeigniter在mysql中的单列中插入数组数据

php - 如何使用 mysql 查询发布新闻

mysql - 如何每次为特定团队返回唯一的消息

c# - 实体代码第一个错误(Mysql)