我有topic(id )和tags(id ,name)和一个链接表topic_tags(topicFk ,tagFk )。
现在,我想选择每个具有所有良好标记(a,b,c)但没有不良标记(d,e,f)的主题。
我怎么做?
我自己的解决方案使用了Pauls和Bills的想法。
这个想法是将具有良好标签的主题进行内部联接(以抛出没有良好标签的主题),然后为每个主题计数唯一的标签(以验证是否存在所有良好的标签)。
同时,带有错误标签的外部联接不应具有单个匹配项(所有字段均为NULL)。
SELECT topics.id FROM topics INNER JOIN topic_tags topic_ptags ON topics.id = topic_ptags.topicFk INNER JOIN tags ptags ON topic_ptags.tagFk = ptags.id AND ptags.name IN ('a','b','c') LEFT JOIN topic_tags topic_ntags ON topics.id = topic_ntags.topicFk LEFT JOIN tags ntags ON topic_ntags.tagFk = ntags.id AND ntags.name IN ('d','e','f') GROUP BY topics.id HAVING count(DISTINCT ptags.id) = 3 AND count(ntags.id) = 0