【问题标题】:complex sql-query for movie listing电影列表的复杂 sql 查询
【发布时间】:2013-02-10 22:14:48
【问题描述】:

我有一个数据库,里面有我在电影院看过的所有电影。它由几个表组成:

  • 放映(包含日期、电影院、电影等的主表)
  • 电影(有关电影的所有信息:标题、导演、长度...)
  • 电影院(有关我观看的电影院的信息,在我的示例中未使用)
  • 标签(连接到电影字段的标签:id、tag)
  • tag_scr(链接表将标签链接到放映,字段:scr_id、tag_id)

大多数放映都连接一个标签(可以是电影节、3d、首映式、现场音乐之类的东西),但放映也可以有零个标签或多个标签,所以我想做的是创建一个查询我在其中列出了所有筛选,并且与该筛选连接的所有标签都连接到一个带有逗号的字符串。我的查询现在看起来像这样:

SELECT screenings.id, movies.title, tags.tag FROM screenings 
JOIN movies ON screenings.ft = movies.id
LEFT JOIN tag_scr ON screenings.id = tag_scr.scr_id
LEFT JOIN tags ON tag_scr.tag_id = tags.id

除了在结果中多次列出具有多个标签的放映之外,这就是我所需要的。如果我按screenings.id 分组,我只会在每次放映时获得第一个标签。是否可以使用 concat 函数、子查询或任何其他方法来做我想做的事?我的数据库是 MySQL 5.5.24。

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:

    是的,你需要使用GROUP_CONCAT

    SELECT screenings.id, movies.title, GROUP_CONCAT(tags.tag SEPARATOR ',') tags
    FROM screenings 
       JOIN movies ON screenings.ft = movies.id
       LEFT JOIN tag_scr ON screenings.id = tag_scr.scr_id
       LEFT JOIN tags ON tag_scr.tag_id = tags.id
    GROUP BY screenings.id, movies.title
    

    默认情况下,您并不需要 SEPARATOR 语法,它是一个逗号。

    http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

    祝你好运。

    【讨论】:

    • 您缺少GROUP BY
    • 非常感谢,我知道我以前见过,效果很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多