使用多个标签搜索Tagtable或在MySQL中选择"Select all exept"

Mis*_*osM 2 php mysql sql tags mysqli

有没有办法选择除匹配之外的所有人?

我正在使用标记表(article_id,tag)和文章表(article_id,title,...);

我目前的问题:现有搜索的工作方式如下:

SELECT DISTINCT `article_id` FROM `TagTable` WHERE `tag` IN ('tag1', 'tag2')
Run Code Online (Sandbox Code Playgroud)

不幸的是,通过这种方式,用户可以获得包含其中一个标签的结果,而您只需要与两个标签匹配的文章.

你会如何实现它?每个标签的几个子查询似乎是一个愚蠢的想法.我的想法是选择所有并删除没有每个标签的所有人.还有更好的想法?

先感谢您.

tea*_*ran 5

哼.

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

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'
);
Run Code Online (Sandbox Code Playgroud)

但既然你说你不想这样做,你可以试试:

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

我还没有测试过,但是那样的东西应该可行.您只需要确保HAVING子句等于您要查找的标签数量.