MySQL:按日期间隔进行级联过滤

时间:2013-04-01 15:43:55

标签: mysql dateinterval

可以帮助我解决这类问题。

我有:

  • posts
  • comments

它们通过comments.post_id = posts.post_id列链接。

我的用户可以按过去的评论过滤帖子:

  • 1小时
  • 24小时
  • 2天等

如果用户选择显示过去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

结果排序依据:

  1. 列表的顶部是2个帖子,这些帖子在过去的一小时内已被评论,并按评论计数排序。
  2. 接下来,我们会发布过去一天评论过的帖子。
  3. 下一篇 - 过去两天发布的帖子
  4. 过去一周评论的帖子,并且应该按照评论次数排序
  5. 过去一个月
  6. 过去的一年
  7. 在此列表的最后,我们需要放置多年前评论过的文章,并且还应按评论次数排序。
  8. 提前致谢。

2 个答案:

答案 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。