2013-04-01 79 views
0

任何人都可以帮助我处理这种类型的查询。MySQL:按日期间隔级联过滤

我:

  • 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. 在年底此列表中我们需要放置比一年前更多的评论文章,并且还应该按照评论次序排列。

在此先感谢。

+0

我认为你最好的解决方案是在'if()'语句中包装每个查询。如果记录计数为0,则运行下一个查询。 –

+0

但过滤器间隔存储在另一个表中,因此管理员可能会增加间隔数。例如。他可以创建另一个过滤器“过去一周”。因此,在这种情况下,我们需要在每次更改过滤器时修改查询 –

+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 
      . . . 
    ) 

时间比较的语法取决于值是存储为时间戳还是日期时间。

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 

如果你想所有的人,只是删除限制。在过去的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。