sql - 查找所有具有特定艺术家姓名的曲目的播放列表?
问题描述
我有两个 Postgres 表:playlists
和tracks
.
我已经创建playlists_tracks
了播放列表和曲目之间的 many_to_many 关系。
曲目包含多列,但我正在查看的是artist
.
查询包含至少一首曲目的所有播放列表列表的最快方法是什么,该曲目的艺术家姓名包含“披头士”?我很难找到一种有效的方法来做到这一点。
解决方案
最便宜和最简单的DISTINCT
操作是.. 首先不要乘以行。半连接为您的查询执行此操作
:EXISTS
SELECT *
FROM playlists p
WHERE EXISTS (
SELECT -- can be empty for EXISTS
FROM playlists_tracks pt
JOIN tracks t USING (track_id)
WHERE pt.playlist_id = p.playlist_id
AND t.artist = 'The Beatles'
);
假设一个典型的多对多实现,如下所述:
(您甚至可以嵌套EXISTS
而不是子查询中的联接。不确定这是否有更多帮助。)
如果表很大,索引可以提高性能。特定查询的理想选择:
CREATE INDEX ON tracks (artist, track_id)
-- 按此顺序排列的列CREATE INDEX ON playlists_tracks (track_id, playlist_id)
-- 按此顺序排列的列
有关的:
推荐阅读
- javascript - Req.body 为空,表示
- python - 如何在quickfix python中立即注销和登录会话
- uwsgi - 使用 unix 套接字运行 Uvicorn
- c++ - C++ 和 xercesc:无法加载消息域
- java - 要成功地将 spring-data-redis 1.8.15 的 XML 配置移动到 2.1.0,需要进行哪些更改?
- apache-spark - 防止 Spark 将 JAR 依赖项复制到每个执行程序节点的 `work/` 文件夹
- angular - Strapi GraphQL - 安全性(标头 Bearer_token)
- tensorflow - 操作已明确分配给 /GPU:1 但可用设备是
- python - 如何在 Pandas DataFrame 行上打印列名?
- c# - C#对tcp套接字通信进行重试