我面对这个(至少对我来说)挑战:
我有一个论坛,其中的帖子存储在表posts
中,而评论存储在表comments
中。发布帖子时,时间戳存储在列INT(11)posts.created_at
中。与评论相同...在发表评论时,评论的时间戳存储在comments.created_at
中。
但是,现在我想知道第一条评论显示的平均时间(以秒为单位)。当然,如果没有给出评论,则不应将其纳入平均值。
这可以在一个SQL查询中完成吗?如果没有,如何用最少量的查询来完成?
希望你有一个想法,因为我没有。
答案 0 :(得分:1)
如果您在日期字段中使用日期类型,那么类似:
SELECT AVG(
DATEDIFF(MIN(comments.created_at), posts.created_at)
)
FROM posts
INNER JOIN comments on comments.post_primary_key = posts.primary_key
应该得到你需要的东西
但正如评论中指出的那样,您并未将日期存储为日期,请记住尝试:
SELECT AVG(
MIN(comments.created_at) - posts.created_at
)
FROM posts
INNER JOIN comments on comments.post_primary_key = posts.primary_key
为了完整 - 我的最新建议...... 你可以试试这个:
SELECT AVG( sub.timeToComment )
FROM (
SELECT MIN(comments.created_at) - posts.created_at as timeToComment
FROM posts
INNER JOIN comments on comments.post_primary_key = posts.primary_key
) as sub
但不确定它与@Xophmeister方法有什么不同
答案 1 :(得分:1)
select posts.id,
avg(comments.created_at - posts.created_at)
from posts
join comments
on comments.id = posts.id
group by posts.id;
这假设MySQL将正确处理日期时算术。
编辑正如@MattFellows指出的那样,此查询不正确,因为它按帖子分组;我是否采用min(comments.created_at)
。实际上,它将返回的结果是完全多余的:使用min
,它将是每个帖子与其第一个评论之间的时间;没有min
,这是帖子和所有评论之间的平均时间(这是一个相当虚假的指标!)......我垂头丧气:P
正确的查询是:
select avg(min(comments.created_at) - posts.created_at)
from posts
join comments
on comments.id = posts.id;
虽然,这也是时间戳是数字的地方,而不是日期时间,显然,MySQL没有重载运算符。
答案 2 :(得分:1)
希望这对您有用:
select avg(first_comments.first_time - posts.created_at)
from posts
join (select comments.post_id
min(comments.created_at) as first_time
from comments
group by post_id) as first_comments
on first_comments.post_id = posts.id;