簡體   English   中英

多對多關系SQL查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM