mysql - 选择给定时间段内某种类型的第一条记录

标签 mysql select

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

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 因为有可能同时创建两个评论。您也可以尝试以下方法,它只获取每个用户的very first 记录,因此您可以取消 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/

相关文章:

php - Symfony 左连接查询

php - 在检查阿拉伯语或英语值之前用替换单词更新表中的行

mysql - 如何从命令行清除未执行的 MySQL 查询?

mysql - 如何查询 Feed 表中的最新项目

javascript - 复选框出现问题并选择单击和更改时的交互

MySQL:按多列分组时选择第一行或最后一行

mysql - 无法添加 NOT NULL 约束

MySQL REGEXP 不会返回基于阿拉伯语的正则表达式的预期结果

mysql - WordPress 以任意顺序获取特定帖子

java - 如何选择条件等于 null 的位置。