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