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

时间:2011-04-15 19:50:01

标签: php mysql sql join left-join

我有两张桌子:

表:电影

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

3 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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'