#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'