首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在此MySQL查询中排除结果

如何在此MySQL查询中排除结果
EN

Stack Overflow用户
提问于 2018-03-21 13:06:34
回答 1查看 26关注 0票数 0

我正在为一些文章建立一个弓形标签系统,并使用这个查询作为测试的起点.

代码语言:javascript
复制
SELECT a.*
FROM tagmap at, articles a, tag t, userExcludedArticles uea
WHERE at.tag_id = t.tag_id
AND (t.name IN ('bookmark', 'webservice', 'semweb'))
AND a.id = at.articleID
GROUP BY a.id 

如果我有一个名为userExcludedArticles (id、userID、articleID)的表,该表存储用户标记为不想查看的文章的id,那么如何将其包括在上面的查询中?

为了进行测试,我在userID表中总共存储了两篇文章,并将它们的两个ie添加到userID 1中--也就是说,这个用户实际上说他们不想被显示这两篇文章。

我在查询中添加了以下一行..。

代码语言:javascript
复制
AND (uea.userID='1' AND a.id <> uea.articleID)

给..。

代码语言:javascript
复制
SELECT a.*
FROM tagmap at, articles a, tag t, userExcludedArticles uea
WHERE at.tag_id = t.tag_id
AND (t.name IN ('bookmark', 'webservice', 'semweb'))
AND a.id = at.articleID
AND (uea.userID='1' AND a.id <> uea.articleID)
GROUP BY a.id

但这两篇文章在搜索时都会出现,而不是没有文章。

如何让它返回所有与包含的标签相匹配的文章,同时排除用户标记为不想看到的任何文章?

谢谢你的时间和帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-21 13:14:55

首先,在结果中不使用聚合时,不要使用GROUP BY。MySQL允许您在没有聚合的情况下使用它,但是它会产生随机的结果。我假设您在这里使用它,因为包含userExcludedArticles表给出了行的副本。这不是正确的处理方法。

在编写查询时,它将检查articles/tag/tagmap中的每一行和userExcludedArticles中的每一行,如果有一行没有文章id,则可以显示。这就是为什么这些文章不被隐藏。

您需要使用NOT EXISTS子句来检查以下内容:

代码语言:javascript
复制
SELECT a.*
FROM tagmap at, articles a, tag t
WHERE at.tag_id = t.tag_id
AND (t.name IN ('bookmark', 'webservice', 'semweb'))
AND a.id = at.articleID
AND NOT EXISTS
    (SELECT 1 from userExcludedArticles
     WHERE userID='1' AND a.id = articleID)

现在您不需要GROUP BY了,因为每篇文章没有多个结果,而且如果userExcludedArticles包含一个带有项目id的行,那么文章是隐藏的,而不管其他行。

另外,最好对表使用JOIN语法,而不是在FROM部分中使用多重语法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49407143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档