我有一个存储用户评论的数据库表:

comments(id, user_id, created_at)

从该表中,我想获取过去 7 天内第一次发表评论的用户数量。

这是我到目前为止所拥有的:
SELECT COUNT(DISTINCT `user_id`)
FROM `comments`
WHERE `created_at` BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()

这将给出评论的用户数量,但不会考虑这些评论是否首先针对其用户。

最佳答案

SELECT COUNT(DISTINCT user_id)
FROM comments AS c1
WHERE c1.created_at BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()
AND NOT EXISTS (SELECT 1 FROM comments AS c2
                WHERE c2.user_id = c1.user_id AND c2.created_at < c1.created_at)
NOT EXISTS 子句检查相同的 user_id 是否具有较早的 created_at 时间的记录。如果是这样,这意味着这不是他们第一次发表评论,因此我们应该对这个记录打折扣。

我保留了 DISTINCT user_id 因为有可能同时创建两个注释。您也可以尝试以下操作,它只会获取每个用户的第一条记录,因此您可以取消 DISTINCT,但我不知道哪个更优化:
SELECT COUNT(*)
FROM comments AS c1
WHERE c1.created_at BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()
AND NOT EXISTS (SELECT 1 FROM comments AS c2
                WHERE c2.user_id = c1.user_id
                AND (c2.created_at < c1.created_at
                    OR (c2.created_at = c1.created_at AND c2.id < c1.id)))

关于mysql - 选择给定时间段内某个类型的第一条记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12246795/

10-13 00:59
查看更多