簡體   English   中英

如何在SQL中實現布爾標記搜索?

[英]How can I implement a boolean tag search in SQL?

給定一個項目表,一個標簽表以及它們之間的聯接表,什么是實現以下形式的查詢的好方法:

p1 AND p2 AND ... AND pn AND NOT n1 AND NOT n2 ... AND NOT nk

我正在使用SQL。 因此,要查找與所有標簽p1 ... pn和n1 ... nk都不匹配的所有項目?

是否有一個好的“標准”解決方案?

我認為這是您要尋找的:

SELECT * FROM TABLE_NAME WHERE COLUMN1 IN ('value1','value2','value3') AND COLUMN1 NOT IN ('value4','value5','value6')

如果沒有,請告訴我。 我可能誤解了您的問題。

這取決於您如何在數據庫中存儲標簽,但是您可能需要IN運算符:

SELECT tag FROM myTags WHERE tag IN ('p1','p2',...)
SELECT tag FROM myTags WHERE tag NOT IN ('p1','p2',...)

在不知道您的架構的情況下很難說,但是這樣可以工作:

select article_id from articles
inner join tag t1 on t1.article_id=articles.article_id and t1.tag='included_tag'
inner join tag t2 on t2.article_id=articles.article_id and t2.tag='another_included_tag'
left outer join tag t3 on t3.article_id=articles.article_id and t3.tag='dont_include_tag'
left outer join tag t4 on t4.article_id=articles.article_id and t4.tag='also_dont_include_tag'
where t3.tag_id is null and t4.tag_id is null

對要包含的標簽進行內部聯接,並對不包含的標簽進行反聯接(外部聯接+必填列為空)

SELECT DISTINCT itemID FROM ItemsTags it, Tags t 
WHERE it.tagID = t.ID AND t.tag IN ('p1','p2','p3') AND t.tag NOT IN ('p4','p5','p6')
SELECT i.title
  FROM items i
 WHERE EXISTS(SELECT * FROM join_table j JOIN tags t ON t.id = j.tag_id WHERE j.item_id = i.id AND t.name = 'tag1')
   AND NOT EXISTS(SELECT * FROM join_table j JOIN tags t ON t.id = j.tag_id WHERE j.item_id = i.id AND t.name = 'tag2')

SQL Server在此結構上做得很好,但是Oracle可能需要一些提示才能正確處理(至少在5年前就這樣做了)。

暫無
暫無

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

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