可以帮助我解决这类问题。
我有:
posts
表comments
表它们通过comments.post_id = posts.post_id
列链接。
我的用户可以按过去的评论过滤帖子:
如果用户选择显示过去1小时的帖子,但此期间没有帖子,我们需要一步一步:
选择过去1 hour
的帖子,如果为空,则为过去的24 hours
,如果为空,则为过去2 days
,如果为空,则自开始以来(没有任何条件)。
有人可以帮我构建这样的查询吗?
UPD
“按评论过滤帖子”表示按评论计数排序。
所以实际目标是请求“显示按过去XXX小时内留下的评论数排序的帖子”。
如果选择“过去一小时”,但过去1小时内没有留下评论的帖子,我们需要提取过去24小时内留下评论的帖子(按评论计数排序),依此类推。
表格结构
文章:
- POST_ID
- 标题
- 含量
- DATE_ADDED
评论
- COMMENT_ID
- 含量
- POST_ID
- DATE_ADDED
所以链接是posts.post_id = comments.post_id
。
当用户查看过去一小时内评论最多的帖子时,我希望得到下一个结果:
posts.post_id | comments_count | posts.date_added | group
---------------+----------------+------------------+----------------
156 | 8 | 2013-04-02 | hour
154 | 3 | 2013-04-02 | hour
129 | 1 | 2013-03-10 | 24 hours
13 | 14 | 2013-02-18 | 48 hours
138 | 6 | 2013-03-29 | week
137 | 4 | 2013-03-29 | week
161 | 21 | 2013-04-11 | month
6 | 2 | 2013-01-24 | year
103 | 8 | 2013-03-02 | since inception
结果排序依据:
提前致谢。
答案 0 :(得分:1)
计算每个组的最新评论。然后使用它来选择您想要的组。您可以使用子查询执行此计算:
select p.* c.*
from posts p join
comments c
on p.post_id = posts.post_id join
(select post_id, max(postdate) as postdate
from comments
group by post_id
) cmax
on cmax.post_id = p.post_id
where (case when timestampdiff(minute, now(), cmax.timestamp) <= 60
then timestampdiff(minute, now(), c.timestamp) <= 60
when timestampdiff(minute, now(), cmax.timestamp) <= 60*24
then timestampdiff(minute, now(), c.timestamp) <= 60*24
. . .
)
时间比较的语法取决于值是存储为时间戳还是日期时间。
答案 1 :(得分:0)
如果你想要过去一小时的前5个帖子,假设你的date_added字段是时间戳,你可以使用:
SELECT post_id,
count(comment_id) as comments_count,
posts.date_added, 'hour' as grouptime
FROM posts
INNER JOIN comments
ON posts.post_id = comments.post_id
WHERE TIMESTAMPDIFF(HOUR, comments.date_added, NOW()) = 0
GROUP BY posts.post_id
ORDER BY count(comment_id) DESC
LIMIT 5
如果你想要所有这些,只需删除LIMIT即可。过去24小时:
SELECT post_id,
count(comment_id) as comments_count,
posts.date_added, '24 hours' as grouptime
FROM posts
INNER JOIN comments
ON posts.post_id = comments.post_id
WHERE TIMESTAMPDIFF(HOUR, comments.date_added, NOW()) < 24
GROUP BY posts.post_id
ORDER BY count(comment_id) DESC
LIMIT 5
以及其他不同的时间段。
如果您希望一次性获取所有这些内容,请在这些查询之间使用UNION。