如何根据多个条件从连接表中获取歌曲

how to fetch songs based on multiple conditions from joined tables

我有两个表 songssong_clubs。架构如下:-

songs schema
 id        available_for      song_name     status
 1           all                 Song 1      1
 2          selection            Song 2      1
 3          selection            Song 3      1
song_clubs schema
song_id     club_id
 2            1
 2            2
 3            2

现在我想获取俱乐部 ID 1 的歌曲,并且该歌曲适用于所有俱乐部。 我的执行输出如下:-

id        available_for      song_name
 1           all                 Song 1
 2          selection            Song 2

我试过下面的查询

select id,available_for,song_name from songs 
 JOIN 
song_clubs
on song_clubs.song_id = songs.id
WHERE songs.status =1 and song_clubs.club_id=1 or songs.available_for ='all'

但它只返回一个基于选择的条目。

你可以用 EXISTS:

SELECT s.id, s.available_for, s.song_name 
FROM songs s
WHERE s.status =1 AND (  
      s.available_for = 'all' 
   OR EXISTS (SELECT 1 FROM song_clubs c WHERE c.club_id = 1 AND c.song_id = s.id))

或使用运算符 IN:

SELECT id, available_for, song_name 
FROM songs 
WHERE status =1 AND (
      available_for = 'all' 
   OR id IN (SELECT song_id FROM song_clubs WHERE club_id = 1))

两件事。

  1. 使用括号对WHERE子句进行分组;否则他们从左到右评估。

  2. 使用 LEFT JOIN 避免丢失第一个 table 中的项目,这些项目与第二个 table 中的任何项目都不匹配。

这应该有效 (https://www.db-fiddle.com/f/6dAz91ejhe8AbGECFDihbu/0)

SELECT id,available_for,song_name 
  FROM songs
  LEFT JOIN song_clubs ON songs.id = song_clubs.song_id
 WHERE songs.status = 1
   AND (song_clubs.club_id=1 or songs.available_for ='all')
 ORDER BY id;

你也可以使用这个答案

select unique id,available_for,song from songs,song_clubs
WHERE (song_clubs.song_id = songs.id and songs.status = 1 and song_clubs.club_id=1) or (songs.available_for ='all');

在这里,我使用完全连接 select 所有匹配项,然后 select 歌曲的唯一 ID 值,因此您只能获得所需的 2 行

注意:如果您的表很大,这不是最佳性能查询。 最好使用 EXISTSLEFT JOIN。所以其他答案对性能更好,这个答案只是另一种方法。