sql - Mysql: левое соединение на нескольких строках и получение 1 строки - PullRequest
5 голосов
/ 15 апреля 2011

У меня есть 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

Ответы [ 3 ]

10 голосов
/ 15 апреля 2011

Функция 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 голос
/ 15 апреля 2011

Если вы хотите, чтобы для каждого типа возвращались отдельные столбцы:

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
0 голосов
/ 16 апреля 2011
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'
...