如何在MySQL查询中排除结果

时间:2018-03-21 13:06:35

标签: mysql

我正在为一些文章设置toxi标记系统,并使用此查询作为测试的起点......

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,我该如何在上述查询中包含该文章?

为了测试,我在我的文章表中总共存储了两篇文章,并将它们的两个id添加到userIDcludedArticles for userID 1 - 即该用户已经有效地表示他们不希望显示这两篇文章。 / p>

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

AND (uea.userID='1' AND a.id <> uea.articleID)

给...

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

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

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

感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:3)

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

现在您的查询已经写好,它会检查userExcludedArticlesarticles / tag / tagmap中每一行的每一行,如果有一行没有&# 39; t有文章ID可以显示。这就是文章没有被隐藏的原因。

您需要使用NOT EXISTS子句来检查:

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部分使用多个语法。