首页 > 解决方案 > 查找所有具有特定艺术家姓名的曲目的播放列表?

问题描述

我有两个 Postgres 表:playliststracks.

我已经创建playlists_tracks了播放列表和曲目之间的 many_to_many 关系。

曲目包含多列,但我正在查看的是artist.

查询包含至少一首曲目的所有播放列表列表的最快方法是什么,该曲目的艺术家姓名包含“披头士”?我很难找到一种有效的方法来做到这一点。

标签: sqlpostgresqlmany-to-manypostgresql-performance

解决方案


最便宜和最简单的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) -- 按此顺序排列的列

有关的:


推荐阅读