在 MySQL 中搜索具有多个标签或 'Select all exept' 的 Tagtable

Search Tagtable with multiple tags or 'Select all exept' in MySQL

有没有办法 select 除了那些匹配的人?

我正在使用标签 table(article_id,标签)和文章 table(article_id,标题,...);

我当前的问题:现有搜索是这样工作的:

SELECT DISTINCT `article_id` FROM `TagTable` WHERE `tag` IN ('tag1', 'tag2')

不幸的是,这样用户得到的结果包含其中一个标签,而您只需要与两个标签都匹配的文章。

你会如何实施?每个标签的几个子查询似乎是一个愚蠢的想法。我的想法是 select 全部并删除所有没有每个标签的人。 有更好的想法吗?

提前谢谢你。

嗯。

最简单的方法是使用子查询:

SELECT a.*
FROM articles a
WHERE a.id IN (
    SELECT article_id FROM TagTable WHERE tag = 'tag1'
) AND a.id IN (
    SELECT article_id FROM TagTable WHERE tag = 'tag2'
);

但既然你说你不想那样做,你可以尝试类似的方法:

SELECT article_id, count(DISTINCT tag)
FROM TagTable
WHERE tag IN ('tag1', 'tag2')
GROUP BY article_id
HAVING count(DISTINCT tag) = 2

我还没有测试过,但类似的东西应该可以工作。您只需确保 HAVING 子句等于您要查找的标签数。