MySQL搜索具有AND NOT特定标签的记录

时间:2016-10-28 14:18:30

标签: mysql tags

在一个大型项目中(在...中解决了问题的集合)我有一个像这样组织的数据(典型的M:N关系):

records | record_id, other_info
tag_map | map_id, record_id, tag_id
tags    | tag_id, tag_text, other info

我想添加过滤功能。在过滤器中,用户可以为每个标签选择是否需要,忽略或禁止其存在。

e.g。我需要找到

的所有记录
  • 标记为tag_id = 1
  • 并且标记为tag_id = 4
  • 并且没有tag_id = 3
  • 的标签
  • 并且任何其他标签都不重要。

2 个答案:

答案 0 :(得分:0)

SQL查询:

SELECT records.record_id, records.otherinfo FROM records, tags, tag_map
WHERE records.record_id = tagmap.record_id AND tags.tag_id = tag_map.tag_id 
AND tags.tag_id = 1 AND tags.tag_id = 4 AND <> 3

答案 1 :(得分:0)

如果(record_id,tag_id)表中tag_map元组是唯一的,我们可以使用连接和反连接操作的组合。

例如:

 SELECT r.record_id
   FROM records r

   JOIN tag_map t1 
     ON t1.record_id = r.record_id
    AND t1.tag_id    = 1  

   JOIN tag_map t4
     ON t4.record_id = r.record_id
    AND t4.tag_id    = 4

   LEFT
   JOIN tag_map t3
     ON t3.record_id = r.record_id
    AND t3.tag_id    = 3

  WHERE t3.record_id IS NULL

同样,这是基于(record_id,tag_id)表中tag_map上唯一性约束的存在。否则,这有可能返回“重复”行。

还有其他查询模式可以返回相同的结果。例如,我们可以使用NOT EXISTS (correlated subquery)代替反连接。