繁体   English   中英

sql - Mysql:在多行上左连接并检索1行

[英]sql - Mysql : Left join on multiple rows and retrieve 1 row

我有2张桌子:

表:电影

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

表:类型

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

我需要一个查询来查找这一行:Movie1: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

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

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

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
SELECT m.Name,
IF(t1.Type IS NOT NULL, 1, 0) as DVD,
IF(t2.Type IS NOT NULL, 1, 0) as Bluray,
IF(t3.Type IS NOT NULL, 1, 0) as VCD
FROM Movies m
LEFT OUTER JOIN Types t1 on m.MovieID = t1.MovieID and t1.Type = 'DVD'
LEFT OUTER JOIN Types t2 on m.MovieID = t2.MovieID and t2.Type = 'Bluray'
LEFT OUTER JOIN Types t3 on m.MovieID = t3.MovieID and t3.Type = 'VCD'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM