sql - 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;
我这里还有一些其他的东西,那是我的锻炼任务!谢谢!
这里还有关系模型:
解决方案
基本上你需要字符串聚合——在 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
推荐阅读
- python - Pandas:遍历列表以匹配数据框中的值
- flutter - 颤振按钮 onPressed() 未在 GestureDetector 中触发
- certificate - 在 Azure 容器实例上设置 TLS SSL 版本 1.2
- c# - UI 不保留 Blazor 中所选项目的复选框值
- javascript - 具有多种测量选项的体积计算器
- html - 如何在为 ap 标签创建新行之前添加字符限制
- css - 与 target="_blank" 的链接仍然受到伪类的影响:用户点击后的悬停样式,仅限 Chrome
- php - FPDF、FPDFI 类和函数
- c++ - 如何在 C++ 中从 R 包调用 R 函数、存储结果并在 C++ 中使用它以进行进一步处理
- java - 为什么在 weblogic 上部署时出现模块异常错误?