在 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连接查询匹配所有标签的多个“标签”(多对多关系)?
Jquery / Mysql:在 jquery 中使用 mysql 数据进行自动完成搜索标签?