[英]conditional sql query for tables
我必須從SQL運行查詢。 也許太容易或不容易,但不幸的是我不懂SQL。 所以這是我的表:
影片
id | movie_name
------------
1 | prometheus
名
id | person_name
-----------------
1 | Ridley Scott
2 | Noomi Rapace
3 | Michael Fassbender
4 | Charlize Theron
5 | Damon Lindelof
films_cast
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
我怎樣才能從這些表中得出這樣的結論:
film_archive
id | movie_name | director | writer | cast
---------------------------------------------------------------------------------------
1 | prometheus | Ridley Scott | Damon Lindelof | Noomi Rapace, Michael Fassbender, Charlize Theron
謝謝!
您需要加入表格,然后在給定合適條件的情況下,在名稱列上執行GROUP_CONCAT()
聚合的電影分組:
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上看到它。
由於你的問題也有sql-server
標簽,不幸的是sql-server沒有GROUP_CONCAT
,需要像FOR XML / STUFF這樣的替代方案:
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;
嘗試這個,
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.