sql — Mysql: левое соединение в нескольких строках и получение 1 строки

#php #mysql #sql #join #left-join

#php #mysql #sql #Присоединиться #левое соединение

Вопрос:

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

Ответ №1:

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
  

Ответ №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
  

Комментарии:

1. Мне действительно нравится этот способ получения дополнительных данных из соединенных строк — это достаточно быстро, и вы можете задать условия для значения соединенных записей, используя HAVING .

Ответ №3:

ВЫБЕРИТЕ m.Name,
ЕСЛИ (t1.Тип НЕ РАВЕН NULL, 1, 0) как DVD, 
ЕСЛИ (t2.Type НЕ РАВЕН NULL, 1, 0) как Bluray, 
ЕСЛИ (t3.Тип НЕ РАВЕН NULL, 1, 0) как VCD
Из фильмов m
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ вводит типы t1 в m.MovieID = t1.MovieID и t1.Тип = 'DVD'
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ вводит типы t2 в m.MovieID = t2.MovieID и t2.Type = 'Bluray'
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ вводит типы t3 в m.MovieID = t3.MovieID и t3.Type = 'VCD'