[英]Many to many relationship SQL query
我正在嘗試創建一個查詢,該查詢可以在多對多關系數據庫中獲取結果。
到目前為止,我得到了以下內容:
一個帶有歌曲的表,一個帶有標簽的表和一個“鏈接”表,因為一首歌曲可以具有多個標簽,而一個標簽可以屬於多首歌曲。
它看起來像這樣:
Songs Link Tags
======= ===== =========
Sid Sid Tid
Songname Tid Tagname
現在假設您有3首AB和C歌曲以及3個標簽:X,Y和Z。
歌曲A的標簽為Y,歌曲B的標簽為Z,歌曲C的標簽為X和Z。
我設法創建了一個查詢,只用一個標簽就可以得到一首歌(例如Z給出B和C)。
但是,當輸入多個標簽(例如,鍵入(搜索)字段)時,我如何創建一個查詢歌曲的查詢。
我搜索了幾次,然后出現了INTERSECT和INNER JOIN命令,但是我無法成功創建查詢。
任何幫助表示贊賞!
這是您基本的多對多選擇語句。
select s.*, t.*
from songs s
join songs_tags st on s.songId = st.songId
join tags t on t.tagId = st.tagId
-- optional where clause
where s.name = 'my song'
當where子句基於標簽時,將其翻轉
select s.*, t.*
from tags t
join songs_tags st on s.songId = st.songId
join songs s on s.songId = st.songId
-- optional where clause
where t.name = 'whatever'
如果要返回帶有多個標簽的所有歌曲,只需更改where子句:
select s.*
from tags t
join songs_tags st on s.songId = st.songId
join songs s on s.songId = st.songId
where t.name in ('tag1', 'tag2', 'tag3')
返回帶有特定標簽的特定歌曲,例如,如果您想按名稱和標簽進行搜索
select s.*, t.*
from songs s
join songs_tags st on s.songId = st.songId
join tags t on t.tagId = st.tagId
where s.name like '%mysong%' and t.name in ('tag1', 'tag2')
您還可以自己過濾聯接表,有時這是必要的:
select s.*, t.*
from songs s
join songs_tags st on s.songId = st.songId
join tags t on t.tagId = st.tagId and t.name in ('tag1', 'tag2')
where s.name like '%mysong%'
查找沒有標簽的歌曲
select s.*
from songs s
left join songs_tags st on s.songId = st.songId
where st.songId is null
要查找具有所有標簽的歌曲:
select s.*
from songs s
join songs_tags st1 on s.songid = st1.songid
join songs_tags st2 on s.songid = st2.songid
join songs_tags st3 on s.songid = st3.songid
where st1.tagid = 1 and st2.tagid = 2 and st3.tagid = 3
該歌曲將獲取所有與任何標簽匹配的歌曲,並首先返回與所有標簽匹配的歌曲:
SELECT s.Sid, s.Songname
FROM Songs s
JOIN Link l ON ( l.Sid = s.Sid )
JOIN Tags t ON ( t.Tid = s.Tid )
WHERE t.Tagname IN ( 'X', 'Y' )
GROUP BY s.Sid, s.Songname
ORDER BY COUNT(1) DESC
這首只會返回與所有標簽匹配的那些歌曲:
SELECT s.Sid, s.Songname
FROM Songs s
JOIN Link l ON ( l.Sid = s.Sid )
JOIN Tags t ON ( t.Tid = s.Tid )
WHERE t.Tagname IN ( 'X', 'Y' )
GROUP BY s.Sid, s.Songname
HAVING COUNT(1) = 2 -- 'X' and 'Y'
如果生成此查詢,則也必須生成計數(在我的情況下為2
)。
SELECT DISTINCT s.Sid, s.Songname
FROM
Songs s join Link l on s.Sid=l.Sid
join Tags t on t.Tid=l.Tid
WHERE t.Tagname in ('Z', 'Y');
這將返回所有帶有EITHER標簽Z或Y的歌曲
select distinct songs.*
from songs
inner join link on link.sid = songs.sid
inner join tags on tags.tid = link.tid
where tagname IN ('a','b','c')
這樣的東西?
你可以試試這個
select a.Sid, a.SongName, c.Tid, c.TagName
from Songs a
LEFT OUTER JOIN Links b ON a.Sid = b.Sid
LEFT OUTER JOIN Tags c ON b.Tid = c.Tid
WHERE c.TagName IN ('Tag1', 'Tag2', ...... ) // as many tags you want
group by a.Sid, a.SongName, c.Tid, c.TagName
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.