php - 过滤 MySQL 中的项目

标签 php mysql

现在我正在开发一个新闻网站。每条新闻都有一个标签。用户可以通过标签过滤新闻。他有三个字段(所有字段都是可选填写的)

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 byhaving,如下所示:

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/

相关文章:

php - 我如何在 symfony2 中使用 DQL 获得单个结果

php - 在 PHP 中解析 Python 数组

php - 当一张表为空或非空时选择两张表

Java JPA 查询

mysql - 与截断语句的标准定义混淆

php - 创建 torrent 文件时计算 (sha1) "pieces"

php - 如何在 Php 中创建帐户电子邮件确认?

php - 保存 bean 是否会删除记录与 SuiteCRM 中电子邮件的连接?

python - MySQL, Python "CREATE"错误 :_mysql_exceptions. ProgrammingError: (1064

php - 更新mysql表中的数据