我正在为一些文章设置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
但这两篇文章都是在搜索时出现的,而不是没有文章。
如何让它返回与所包含标签匹配的所有文章,同时排除用户标记为不想看到的任何文章?
感谢您的时间和帮助。
答案 0 :(得分:3)
首先,如果您未在结果中使用聚合,请不要使用GROUP BY
。 MySQL允许您在没有聚合的情况下使用它,但它会产生随机结果。我假设你在这里使用它,因为包含userExcludedArticles
表会给你重复的行。这不是处理它的正确方法。
现在您的查询已经写好,它会检查userExcludedArticles
中articles
/ 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
部分使用多个语法。