【问题标题】:Issue in Query to find users who have not commented on any posts for last xx days查询中的问题以查找过去 xx 天内未对任何帖子发表评论的用户
【发布时间】:2020-09-26 15:29:24
【问题描述】:

我一直在使用 mysql 查询来查找在过去 10 天内没有针对任何帖子发布任何 cmets 的用户。 我在下面写了这样的东西。但找不到预期的结果。

我有三个表用户、帖子、评论。

SELECT * FROM users AS u
LEFT JOIN posts AS p ON u.userID = p.postID
LEFT JOIN comments AS c ON p.postID = c.postID 
group by p.p.postID 
having  (max(t.addedDate) < DATE_SUB(NOW(), INTERVAL 10 DAY));

此查询仍返回我在过去 10 天内发布 cmets 的用户。不知道我在这里做错了什么。如果有人可以在这里帮助我?

【问题讨论】:

  • 请提供样本数据和期望的结果。 having 子句中有别名 tfrom 子句中没有这样的表。另外,加入条件u.userID = p.postID 对我来说似乎很可疑。
  • 这里没有什么可疑的。我之前只是给出了不同的别名,并对其进行了更改以使其在此处具有相关性,而忘记在有子句中进行更新。这是更新版本: SELECT * FROM users AS u LEFT JOIN posts AS p ON u.userID = p.userID LEFT JOIN cmets AS c ON p.postID = c.postID group by p.p.postID with (max(c. addedDate)
  • 这里的逻辑是完全错误的。首先,您不需要users - posts 关系。您应该拥有并使用users - comments 关系。其次,尝试使用 SQL not existsnot in 运算符解决您的问题。

标签: mysql database days


【解决方案1】:

Exists logic 似乎是您要求的最直接的翻译:

SELECT *
FROM users u
WHERE NOT EXISTS (SELECT 1 FROM posts p
                  INNER JOIN comments c ON p.postID = c.postID
                  WHERE p.userID = u.userID AND
                        c.addedDate >= DATE_SUB(NOW(), INTERVAL 10 DAY));

【讨论】:

  • 感谢您的建议。但我的逻辑有什么问题?
【解决方案2】:

问题来了: 您想查找在过去 10 天内未发布针对任何帖子的任何 cmets 的用户。加入 usersposts 然后 comments 将为您提供创建了包含一些 cmets 的帖子的用户。任何进一步的过滤都将应用于错误的子集。

假设您的comments 表确实有一个userId 字段,下面是关于如何解决它的猜测。否则,请将您的架构添加到问题中。

select * 
from users u
where u.id not in (
    select c.userID 
    from comments c 
    where c.addedDate >= DATE_SUB(NOW(), INTERVAL 10 DAY)
)

【讨论】:

    猜你喜欢
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    相关资源
    最近更新 更多