【问题标题】:Filtering items in MySQL在 MySQL 中过滤项目
【发布时间】:2015-09-03 10:25:52
【问题描述】:

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

1)文章中至少要有一个标签

2)每篇文章中必须包含的标签

3)文章中不能出现的标签

标签链接到带有表格的文章

`news_id`|`tag_id`
    1    |   2
    4    |   1
    4    |   4
    5    |   1
    5    |   5
   ...   |  ...

当用户按下Save filter 时,我会收到标签 ID。 如何用一个 mysql 查询过滤news_id

现在,我有这个查询

SELECT * FROM `app_news_newstag` GROUP BY `news_id` HAVING `tag_id` IN ('1', '4', '5') AND `tag_id` NOT IN ('2')

我想它涵盖了第一个和第三个字段,但我坚持使用第二个

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    我建议使用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 将布尔表达式视为 1 表示真,0 表示假,这就是为什么这样做(没有case)。

    第二个条件只是检查标签永远不存在。

    注意:如果 id 是数字,那么你不应该对常量使用单引号。用于数值比较的字符串常量具有误导性。

    【讨论】:

    • 嗯,但是您的查询会覆盖第二个字段吗?
    • 您的问题是关于news_idtag_id 以及处理包含和排除。如果您有不同的问题,应将其作为一个问题提出,并附上样本数据和期望的结果。
    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 2021-07-09
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多