如何在SQL中实现布尔标记搜索?

时间:2009-03-02 15:56:36

标签: sql database search tags

给定一个项目表,一个标签表和它们之间的连接表,实现表单查询的有效方法是什么:

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

我正在使用SQL。那么要查找所有匹配所有标签p1 ... pn且没有n1 ... nk的项目?

对此有一个很好的“标准”解决方案吗?

5 个答案:

答案 0 :(得分:2)

我认为这就是你要找的东西:

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

如果没有,请告诉我。我可能误解了你的问题。

答案 1 :(得分:2)

这取决于您在数据库中存储标记的方式,但您可能需要IN运算符:

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

答案 2 :(得分:2)

很难说不知道你的架构,但这样的事情会起作用:

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

内连接到要包含的标记,并对不包含的标记执行反连接(外连接+所需列为空)

答案 3 :(得分:1)

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')

答案 4 :(得分:0)

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服务器在这个构造方面做得很好,但Oracle可能需要一些暗示才能做到正确(至少在5年前做过)。