【问题标题】:Mysql query to get posts with recent comments - including comment countMysql 查询以获取具有最近评论的帖子 - 包括评论计数
【发布时间】:2020-11-27 13:51:18
【问题描述】:

我需要

  1. 获取过去 15 天内有人发表过评论的帖子
  2. 按评论数排序
  3. 返回帖子 ID 以及相关帖子的 cmets 总数

这就是我所拥有的:

SELECT post.id, COUNT(DISTINCT postcomments.id) as comments
FROM posts
LEFT JOIN postcomments on postcomments.postid = post.id
WHERE postcomment.posted_at >= DATE_SUB(NOW(), INTERVAL 15 DAY)
GROUP BY post.id
HAVING comments > 0
ORDER BY comments DESC

我的查询的问题是我的评论计数仅包括过去 15 天内发布的 cmets,而我想要帖子的 cmets 总数。如何在一个查询中实现这一目标?

【问题讨论】:

标签: mysql sql


【解决方案1】:
SELECT post.id, COUNT(DISTINCT postcomments.id) as comments
FROM posts
JOIN postcomments on postcomments.postid = post.id
GROUP BY post.id
HAVING MAX(postcomment.posted_at) >= DATE_SUB(NOW(), INTERVAL 15 DAY)
ORDER BY comments DESC

【讨论】:

  • @TimBiegeleisen 我不这么认为。他们只需要在过去 15 天内有评论的帖子,但需要这些帖子的所有 cmets 的总数。
  • @TimBiegeleisen OP 直接说:“而我想要帖子的 cmets 总数”。根据where 条款,它应该受到最近评论的帖子的限制
  • MAX 正在获取最新的 posted_at 值。您的情况在 15 天内,因此 MAX(posted_at) >= DATE_SUB(NOW(), INTERVAL 15 DAY) 正在检查 post.id 的最后发布日期是否在 15 天内。如果您移动MAX 而只是简单的posted_atHAVING 将返回错误,因为在SELECT 中未指定该列。如果将posted_at 列放在SELECT 中,也会出现错误,因为它不在GROUP BY 中。如果你把posted_at 放在GROUP BY 中,你会得到不同的结果。 See this example fiddle
  • 如果您查看小提琴中的最后一个查询(我在上面的评论),我在posted_at 列上添加了GROUP_CONCAT 以列出与post.id 对应的所有日期;按升序排列。我还在SELECT 中添加了MAX(posted_at),这样您就可以看到最后的发布日期是什么。由于MAX(posted_at) 是一个函数(posted_at 列仅用于该函数),因此即使SELECT 中未指定HAVING,使用它也不会出现问题。如果我遗漏了或陈述了不正确的内容,我会提前道歉,但这就是我的理解。
  • 具体来说,因为MAX 是一个聚合函数,这是一种特殊类型的函数,它根据组成组的所有行的值为每个GROUP BY 组返回一个值。
【解决方案2】:

也许你想在这里使用条件聚合:

SELECT
    p.id,
    SUM(pc.posted_at >= DATE_SUB(NOW(), INTERVAL 15 DAY)) AS comments
FROM posts p
LEFT JOIN postcomments pc ON pc.postid = p.id
GROUP BY
    p.id
HAVING
    COUNT(*) > 0
ORDER BY
    comments DESC;

comments 计数仍应与以前相同,只是现在我们断言 cmets 的总数,而不是仅断言过去 15 天内的 cmets。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多