簡體   English   中英

查詢多對多鏈接表

[英]Querying a Many-to-Many Linking Table

我有一個多對多關系的鏈接表,其中包含字段 -

  • 身份證
  • 身份標簽

我想過濾與包含指定數量標簽的筆記相關聯的所有標簽。

例如,如果我選擇標簽“ Running ”、“ Form ”和“ Times ”,那么我想查看與具有這 3 個標簽的筆記相關聯的所有標簽。

前端的用戶將使用此過程來優化他們正在查找的結果,因此我需要能夠使用代碼 ( node.js ) 生成此 SQL,並且可能會多次進行標簽過濾。

我有下面的SQL代碼,可以查詢兩個標簽,但是有一些問題:

  1. 似乎效率不高
  2. 如果需要添加另一層filer,則無法通過代碼輕松生成
SELECT DISTINCT idtag FROM table WHERE idnote IN (SELECT idnote FROM 
(SELECT * FROM table WHERE idnote IN (SELECT idnote FROM table WHERE idtag 
= 'Example')) as t1 where t1.idtag = 'SecondExample');

我希望就如何提高此代碼的效率以及將 sql 語句轉換為易於代碼生成的內容提出一些建議。

聽起來像一個數據陷阱,笛卡爾積https://en.wikipedia.org/wiki/Cartesian_product

有什么東西可以橋接這兩個表嗎? 就像我們可以加入的兩者之間的公共表? 代替 N:N
表 A 與筆記表 (B) 和標簽表 (C) 有一些共同點,我們可以讓表 A 以 1:N 的形式連接到表 B,而表 A 也以 1:N 的形式連接到 C

然后你可以用一個共同的表格將兩個單獨的事實拼接在一起

嘗試這樣的事情:

; with cteTagList as 
    (select 'Example' idtag
    union select 'SecondExample'
    --...
    union select 'LastExample'
    )
select t.idnote
from table t inner join cteTabList l on l.idtag = t.idtag
group by t.idnote
having count(*) = [NUMBER_OF_SEARCH_TAGS]

在其中生成包含所有搜索標簽的 CTE(公用表表達式)。 將它與多對多關系表連接起來,只選擇那些帽子數等於用戶輸入的搜索標簽數量的筆記,在查詢中注明[NUMBER_OF_SEARCH_TAGS]

我使用您的'Running','Form','Times'示例作為指定的標簽集。

select distinct idTag from table 
where idNote in (select idNote from table where idTag in ('Running'))
and idNote in (select idNote from table where idTag in ('Form'))
and idNote in (select idNote from table where idTag in ('Times'))


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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