首页 > 解决方案 > SQL 将重复项收集到一个地方?PostgreSQL

问题描述

抱歉,我是新来的,我也是 SQL 新手,无法在标题中真正解释我的问题...

所以我有一个电视节目数据库,我有一个流派列,但是对于一个电视节目,存储了多个流派,所以当我选择所有电视节目时,我该如何组合它们?

它需要看起来像这样:

https://i.stack.imgur.com/3EhBj.png

所以我必须将字符串组合在一起,这是我到目前为止写的代码:

SELECT title,
               year,
               runtime,
               MIN(name) as name,
               ROUND(rating, 1) as rating,
               trailer,
               homepage
        FROM shows
        JOIN show_genres 
            on shows.id = show_genres.show_id 
        JOIN genres 
            on show_genres.genre_id = genres.id
        GROUP BY title,
               year,
               runtime,
               rating,
               trailer,
               homepage
        ORDER BY rating DESC
        LIMIT 15;

我这里还有一些其他的东西,那是我的锻炼任务!谢谢!

这里还有关系模型:

https://i.stack.imgur.com/M89ho.png

标签: sqlstringpostgresqljoingroup-by

解决方案


基本上你需要字符串聚合——在 Postgres 中,你可以使用string_agg()它。

为了提高效率,我建议将聚合移动到相关子查询或横向连接,而不是在外部查询中聚合,因此:

SELECT 
    s.title,
    s.year,
    s.runtime,
    g.genre_names,
    ROUND(s.rating, 1) as rating,
    s.trailer,
    s.homepage
FROM shows s
LEFT JOIN LATERAL (
    SELECT string_agg(g.name, ', ') genre_names
    FROM show_genres sg
    INNER JOIN genres g ON g.id = sg.genre_id
    WHERE sg.show_id = s.id
) g ON 1 = 1
ORDER BY s.rating DESC
LIMIT 15

推荐阅读