2011-04-15 9 views
5

Tengo 2 tablas:sql - MySQL: Izquierda se unen en múltiples filas y recuperar 1 hilera

Tabla: Películas

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

Tabla: Tipos

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

necesito una consulta a descubra esto en una fila: Película 1: DVD - Bluray - VCD

Yo solía:

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 

Pero las tuberías de retorno de varios discos:

Movies.Name -- DVD -- Bluray -- VCD 
Movie1   -- 1  -- 0  -- 0 
Movie1   -- 0  -- 1  -- 0 
Movie1   -- 0  -- 0  -- 1 
Movie2   -- 1  -- 0  -- 0 

que quiero:

Movie1   -- 1  -- 1  -- 1 
Movie2   -- 1  -- 0  -- 0 

Respuesta

10

La función group_concat() puede hacer el truco, aquí.


No se ha probado, pero supongo que algo como esto debería funcionar:

SELECT Movies.Name, 
    group_concat(type separator ' - ') as type 
FROM Movies 
    LEFT JOIN Types ON Movies.MovieID = Types.MovieID 
group by Movies.Name 
+0

funciona muy bien! Gracias. – Hamid

+0

De nada :-) Diviértete! –

1

Suponiendo que desee columnas separadas devueltos para cada tipo:

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
 
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' 
Cuestiones relacionadas