2015-09-03 93 views
0

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

1)至少有一个标签应该是在文章中

2)标签必须为每一篇文章中

3)标签必须不在文章链接到文章

标签与表

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

当用户按下Save filter我收到的标签标识。 如何使用一个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') 

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

回答

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表示true,0表示false,这就是为什么这可以工作(没有case)。

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

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

+0

嗯,但你的查询将覆盖第二个领域? – Rulisp

+0

你的问题是关于'news_id'和'tag_id'并处理包含和排除。如果你有不同的问题,你应该把它作为一个问题,提供样本数据和期望的结果。 –