在一个大型项目中(在...中解决了问题的集合)我有一个像这样组织的数据(典型的M:N关系):
records | record_id, other_info
tag_map | map_id, record_id, tag_id
tags | tag_id, tag_text, other info
我想添加过滤功能。在过滤器中,用户可以为每个标签选择是否需要,忽略或禁止其存在。
e.g。我需要找到
的所有记录答案 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)
代替反连接。