在单个语句中选择“多对多”和“属于”

时间:2019-10-06 00:53:47

标签: sql postgresql

abc
content_1
content_1b
--- End ---

总的来说,播放列表可以是公共的(使用联结表分配给用户)或私有的(通过设置播放列表user_id属于用户)。如何在一次选择中查询用户的所有播放列表?那有可能吗?

2 个答案:

答案 0 :(得分:1)

此查询应为您提供所需的结果。通过JOIN(对于公共播放列表)或直接(对于私人播放列表)user playlistuser_playlist

SELECT DISTINCT p.id, p.name
FROM user u
LEFT JOIN user_playlist up ON up.user_id = u.id
JOIN playlist p ON p.id = up.playlist_id OR p.user_id = u.id

您只需添加适当的WHERE子句(例如u.id = 4u.name = 'bill')即可选择感兴趣的用户。

Demo on dbfiddle

答案 1 :(得分:1)

我建议exists

select pl.*
from playlist pl
where pl.user_id = :user or
      exists (select 1
              from user_playlist upl
              where upl.play_list_id = pl.id and
                    upl.user_id = :user
             );

实际上不需要user表,除非您要为 all 个用户运行查询,或者您需要访问名称。您的问题似乎一次只涉及一个用户。