如何根据多个条件从连接表中获取歌曲
how to fetch songs based on multiple conditions from joined tables
我有两个表 songs 和 song_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))
两件事。
使用括号对WHERE子句进行分组;否则他们从左到右评估。
使用 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 行
注意:如果您的表很大,这不是最佳性能查询。
最好使用 EXISTS
或 LEFT JOIN
。所以其他答案对性能更好,这个答案只是另一种方法。
我有两个表 songs 和 song_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))
两件事。
使用括号对WHERE子句进行分组;否则他们从左到右评估。
使用 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 行
注意:如果您的表很大,这不是最佳性能查询。
最好使用 EXISTS
或 LEFT JOIN
。所以其他答案对性能更好,这个答案只是另一种方法。