簡體   English   中英

表的條件sql查詢

[英]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;

SQLFiddle在這里

嘗試這個,

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演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM