有没有办法选择所有的,除了那些匹配的?
我正在使用一个标记表(article_id,tag)和一个article表(article_id,title,…);
我目前的问题是:现有的搜索工作是这样的:

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

不幸的是,这样用户就可以得到包含其中一个标记的结果,而您只需要与两个标记都匹配的文章。
你将如何实施它?每个标签有几个子查询似乎是个愚蠢的想法。我的想法是选择所有并删除所有没有每个标签的人。
有更好的主意吗?
提前谢谢你。

最佳答案

隐马尔可夫模型。
最简单的方法是使用子查询:

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子句等于您要查找的标记数。

07-25 23:06