小编典典

MySQL的减号?

sql

我有topic(id )和tags(id ,name)和一个链接表topic_tags(topicFk ,tagFk )。

现在,我想选择每个具有所有良好标记(a,b,c)但没有不良标记(d,e,f)的主题。

我怎么做?


阅读 166

收藏
2021-04-28

共1个答案

小编典典

我自己的解决方案使用了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
2021-04-28