【问题标题】:sql - Mysql : Left join on multiple rows and retrieve 1 rowsql - Mysql:左连接多行并检索 1 行
【发布时间】:2011-08-06 14:26:12
【问题描述】:

我有 2 张桌子:

表格:电影

MovieID -- Name
1          -- Movie1
2          -- Movie2

表格:类型

MovieID -- Type
1          -- DVD
1          -- Bluray
1          -- VCD
2          -- DVD

我需要一个查询来在一行中找出这个: 电影 1 : DVD - Bluray - VCD

我用过:

SELECT Movies.Name,
IF(TYPE = 'DVD', 1, 0 ) AS DVD,
IF(TYPE = 'Bluray', 1, 0 ) AS Bluray,
IF(TYPE = 'VCD', 1, 0 ) AS VCD
FROM Movies LEFT JOIN Types ON Movies.MovieID = Types.MovieID

但它返回多板行:

Movies.Name -- DVD -- Bluray -- VCD
Movie1          -- 1     -- 0        -- 0
Movie1          -- 0     -- 1        -- 0
Movie1          -- 0     -- 0        -- 1
Movie2          -- 1     -- 0        -- 0

我想要:

Movie1          -- 1     -- 1        -- 1
Movie2          -- 1     -- 0        -- 0

【问题讨论】:

    标签: php mysql sql join left-join


    【解决方案1】:
    选择 m.Name, IF(t1.Type IS NOT NULL, 1, 0) 作为 DVD, IF(t2.Type IS NOT NULL, 1, 0) 作为蓝光, IF(t3.Type IS NOT NULL, 1, 0) 作为 VCD FROM 电影 m.MovieID = t1.MovieID 和 t1.Type = 'DVD' 上的左外连接类型 t1 m.MovieID = t2.MovieID 和 t2.Type = 'Bluray' 上的左外连接类型 t2 m.MovieID = t3.MovieID 和 t3.Type = 'VCD' 上的左外连接类型 t3

    【讨论】:

      【解决方案2】:

      假设您希望为每种类型返回单独的列:

      SELECT m.Name, 
             SUM(CASE WHEN t.Type = 'DVD' THEN 1 ELSE 0 END) AS DVD,
             SUM(CASE WHEN t.Type = 'Bluray' THEN 1 ELSE 0 END) AS Bluray,
             SUM(CASE WHEN t.Type = 'VCD' THEN 1 ELSE 0 END) AS VCD
          FROM Movies m
              LEFT JOIN Types t 
                  ON m.MovieID = t.MovieID
          GROUP BY m.Name
      

      【讨论】:

      • 我真的很喜欢这种从连接行中获取额外数据的方式 - 它相当快,并且您可以使用 HAVING 来设置连接记录值的条件。
      【解决方案3】:

      group_concat() 函数可能会起作用,在这里。


      未经测试,但我想这样的东西应该可以工作:

      SELECT Movies.Name,
          group_concat(type separator ' - ') as type
      FROM Movies 
          LEFT JOIN Types ON Movies.MovieID = Types.MovieID
      group by Movies.Name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多