现在我正在开发一个新闻网站。每条新闻都有一个标签。用户可以通过标签过滤新闻。他有三个字段(所有字段都是可选填写的)
1)文章中至少应有一个标签
2)每篇文章中必须出现的标签
3)文章中不得出现的标签
链接到带有表格的文章的标签
`news_id`|`tag_id`
1 | 2
4 | 1
4 | 4
5 | 1
5 | 5
... | ...
当用户按保存过滤器
时,我收到标签 ID。
如何使用一个 mysql 查询过滤 news_id
's?
现在,我有这个查询
SELECT * FROM `app_news_newstag` GROUP BY `news_id` HAVING `tag_id` IN ('1', '4', '5') AND `tag_id` NOT IN ('2')
我认为它涵盖了第一和第三个字段,但我坚持使用第二个
最佳答案
我建议使用group by
和having
,如下所示:
SELECT news_id
FROM `app_news_newstag`
GROUP BY news_id
HAVING sum(tag_id IN ('1', '4', '5')) = 3 AND
sum(tag_id` IN ('2')) = 0;
求和即为匹配数。假设文章上没有重复的标签,那么您可以只计算每篇文章的匹配数。在数字上下文中,MySQL 将 bool 表达式视为 1 表示 true,0 表示 false,这就是它起作用的原因(没有 case
)。
第二个条件只是检查标签是否不存在。
注意:如果 id 是数字,则不应为常量使用单引号。用于数字比较的字符串常量具有误导性。
关于php - 过滤 MySQL 中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32365963/