0

任何人都可以帮助我进行此类查询。

我有:

  • posts桌子
  • comments桌子

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

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

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

如果用户选择显示过去 1 小时的帖子,但在此期间没有帖子,我们需要逐步进行:

为过去选择帖子1 hour,如果为空 - 为过去24 hours,如果为空 - 为过去2 days,如果为空 - 自成立以来(无任何条件)。

谁能帮我建立这样的查询?

UPD

“按评论过滤帖子”是指按评论数排序。

所以实际上目标是请求“显示按过去 XXX 小时内留下的评论数排序的帖子”

如果选择“过去一小时”,但过去 1 小时内没有留下评论的帖子,我们需要获取过去 24 小时内留下评论的帖子(按评论数排序)等等。

表结构

帖子:

  • post_id
  • 标题
  • 内容
  • 添加日期

评论

  • comment_id
  • 内容
  • post_id
  • 添加日期

所以链接是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. 下一个 — 2 天内评论的帖子
  4. 上周发表评论的帖子,再次按评论数排序
  5. 过去一个月
  6. 在过去的一年
  7. 在这个列表的最后,我们需要放置评论超过一年的文章,它们也应该按评论数排序。

提前致谢。

4

2 回答 2

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

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

于 2013-04-01T15:57:38.413 回答
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。

于 2013-04-15T09:12:57.663 回答