【发布时间】:2017-12-08 16:52:26
【问题描述】:
我有 4 张桌子。
帖子:id、标题
标签:id、名称
post_tag:id、post_id、tag_id
user_read_activity:id、user_id、post_id
User_read_activity 包含用户已阅读的帖子。 Post_tag 包含链接到标签的帖子。一篇文章可以有多个标签。我需要根据用户关注的某些标签来获取用户未读的帖子,并删除用户可能不喜欢的某些帖子。
我想出了这段代码。但这是错误的。这也给了我用户阅读的帖子。但基于标签,这些是正确的。只需要更正未读的部分。请帮我解决这个问题。
如果代码有任何错误,也请帮助我更正代码。
SELECT DISTINCT post.* FROM post
INNER JOIN post_tag ON post.id = post_tag.post_id
INNER JOIN tag
WHERE tag.id = 21 OR tag.id = 26 OR tag.id = 63 OR tag.id = 86 OR tag.id = 11
AND post.id != 1088 AND post.id != 338 AND post.id != 1396
AND post.id NOT IN (SELECT post_id from user_read_activity WHERE user_id = 70)
ORDER BY post.likes DESC LIMIT 5
【问题讨论】:
-
为什么不使用 IN 作为标签 ID?像这样:
WHERE tag.id IN (21,26,63,86,11) -
在没有任何聚合函数的情况下,GROUP BY 子句充其量是误导性的,最坏的情况是错误的。
-
@Strawberry 我重复了相同的帖子。这就是为什么我添加了 GROUP BY
-
@SalluSalman 错误未使用
Group by进行聚合。您应该(在某些数据库中,必须)指定您希望 MySQL 如何处理任何冲突...使用MAX或MIN等函数。 -
DISTINCT 将返回一组“正确”的不同结果。
标签: mysql