2012-09-16 40 views
6

SQL'den bir sorgu çalıştırmam gerekiyor. Belki de çok kolay ya da değil, ama ne yazık ki SQL anlamıyorum.tabloları için koşullu sql sorgusu

filmler

id | movie_name 
------------ 
1 | prometheus 

isimleri

id | person_name 
----------------- 
1 | Ridley Scott 
2 | Noomi Rapace 
3 | Michael Fassbender 
4 | Charlize Theron 
5 | Damon Lindelof 

elimden

id | film_id | person_id | type 
------------------------------- 
1 | 1  | 1   | director 
2 | 1  | 2   | actor 
3 | 1  | 3   | actor 
4 | 1  | 4   | actor 
5 | 1  | 5   | writer 

films_cast nasıl: İşte benim tablolar var Bu tablolarda böyle bir sonuca varmak:

film_archive

id | movie_name | director  | writer   | cast 
--------------------------------------------------------------------------------------- 
1 | prometheus | Ridley Scott | Damon Lindelof | Noomi Rapace, Michael Fassbender, Charlize Theron 

teşekkür ederiz!

cevap

6

Sen uygun bir koşul verilen isimler sütun üzerinde GROUP_CONCAT() toplanmasına gerçekleştirerek filmin ederek tablolar, daha sonra grup join gerekir:

SELECT f.id, 
     f.movie_name, 
     GROUP_CONCAT(IF(c.type='director', n.person_name, NULL)) AS director, 
     GROUP_CONCAT(IF(c.type='writer', n.person_name, NULL)) AS writer, 
     GROUP_CONCAT(IF(c.type='actor', n.person_name, NULL)) AS cast 
FROM  films f LEFT JOIN films_cast c ON c.film_id = f.id 
       LEFT JOIN names n  ON c.person_id = n.id 
GROUP BY f.id 

sqlfiddle üzerine bakın.

+1

Bunu yapabildiğimden çok daha hızlı yaptın! –

+0

Bu sonuçları bir CSV/TXT dosyasına nasıl dışa aktarabilirim? –

+0

@jeangrey: 'FROM' deyiminden önce, '' INTO OUTFILE '' /path/to/file.csv 'TARAFINDAN SONRA' '' '' '' '' '' '' '' SEÇENEKLERİNE DAHİL OLUN. – eggyal

1

bu deneyin,

SELECT  a.id, a.movie_name, 
      GROUP_CONCAT((CASE WHEN b.type = 'director' THEN c.person_name ELSE NULL END)) as `director`, 
      GROUP_CONCAT((CASE WHEN b.type = 'writer' THEN c.person_name ELSE NULL END)) as `writer`, 
      GROUP_CONCAT((CASE WHEN b.type = 'actor' THEN c.person_name ELSE NULL END)) as `cast` 
FROM  films a 
      LEFT JOIN film_cast b 
       ON a.id = b.film_id 
      LEFT JOIN names c 
       ON b.person_id = c.id 
GROUP BY a.id, a.movie_name 

SQLFiddle Demo

+0

Hızlı cevap! –

2

ayrıca soru üzerine sql-server etiketine sahip olduğundan, ne yazık ki sql-server GROUP_CONCAT yoktur FOR XML/STUFF gibi alternatif gereklidir:

SELECT f.id, f.movie_name, 
     STUFF((SELECT ',' + p.person_name 
       FROM persons p 
       INNER JOIN films_cast fc on fc.person_id = p.id 
       WHERE fc.film_id = f.id AND fc.type = 'director' 
       FOR XML PATH ('')) 
      , 1, 1, '') AS director, 
     STUFF((SELECT ',' + p.person_name 
       FROM persons p 
       INNER JOIN films_cast fc on fc.person_id = p.id 
       WHERE fc.film_id = f.id AND fc.type = 'writer' 
       FOR XML PATH ('')) 
      , 1, 1, '') AS writer, 
     STUFF((SELECT ',' + p.person_name 
       FROM persons p 
       INNER JOIN films_cast fc on fc.person_id = p.id 
       WHERE fc.film_id = f.id AND fc.type = 'actor' 
       FOR XML PATH ('')) 
      , 1, 1, '') AS cast 
    FROM films f; 

SQLFiddle here