我正在为一些文章建立一个弓形标签系统,并使用这个查询作为测试的起点.
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中--也就是说,这个用户实际上说他们不想被显示这两篇文章。
我在查询中添加了以下一行..。
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但这两篇文章在搜索时都会出现,而不是没有文章。
如何让它返回所有与包含的标签相匹配的文章,同时排除用户标记为不想看到的任何文章?
谢谢你的时间和帮助。
发布于 2018-03-21 13:14:55
首先,在结果中不使用聚合时,不要使用GROUP BY。MySQL允许您在没有聚合的情况下使用它,但是它会产生随机的结果。我假设您在这里使用它,因为包含userExcludedArticles表给出了行的副本。这不是正确的处理方法。
在编写查询时,它将检查articles/tag/tagmap中的每一行和userExcludedArticles中的每一行,如果有一行没有文章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部分中使用多重语法。
https://stackoverflow.com/questions/49407143
复制相似问题