在 MySQL 中使用多个标签搜索标签表或“全选”

Posted

技术标签:

【中文标题】在 MySQL 中使用多个标签搜索标签表或“全选”【英文标题】:Search Tagtable with multiple tags or 'Select all exept' in MySQL 【发布时间】:2015-12-30 00:36:16 【问题描述】:

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

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

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

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

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

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

提前谢谢你。

【问题讨论】:

你试过说 WHERE NOT IN ... 吗?? 我猜这仍然需要一个子查询。也许这是可以避免的? 我不这么认为。我很确定你可以说 WHERE tag NOT IN ('tag1', 'tag2')。 我的意思是得到我想要的。我实际上想要所有带有标签的人,除了我的方法之外,获取所有内容。如果我没有传递所有其他标签,我将需要一个子查询来获取所有标签,然后排除那些不在我想要的标签中的标签 【参考方案1】:

嗯。

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

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

【讨论】:

如果子查询如此常用,我想我将不得不习惯使用它们。无论如何,您的第二个想法非常有效。谢谢你。很有创意。 对于所有 SQL,您应该使用更快的查询。老实说,我不能说在这种情况下这两个中哪一个会更快,但我怀疑第二个会是因为它的解释计划更简单。

以上是关于在 MySQL 中使用多个标签搜索标签表或“全选”的主要内容,如果未能解决你的问题,请参考以下文章

如何让 mysql 与标签搜索一起获得平均评分?

Mysql连接查询匹配所有标签的多个“标签”(多对多关系)?

Jquery / Mysql:在 jquery 中使用 mysql 数据进行自动完成搜索标签?

solr 搜索多个类别和标签

在 Django 中,正确地制作具有多个类别、多个标签和搜索的查询集?

在MySQL中设置的标签中搜索