【问题标题】:MySQL: Cascade filtering by date intervalsMySQL:按日期间隔进行级联过滤
【发布时间】:2013-03-22 17:07:58
【问题描述】:

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

我有:

  • posts
  • comments

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

我的用户可以通过 cmets 过滤过去的帖子:

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

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

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

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

UPD

“按 cmets 过滤帖子”是指按 cmets 计数排序。

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

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

表格结构

帖子:

  • 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 个在过去一小时内发表评论的帖子,并按 cmets 计数排序。
  2. 接下来,我们放置在过去一天发表评论的帖子。
  3. 下一个 - 已在 2 天内发表评论的帖子
  4. 已于上周发表评论的帖子,再次应按 cmets 计数排序
  5. 过去一个月
  6. 过去一年
  7. 在这个列表的最后,我们需要放置评论超过一年的文章,它们也应该按 cmets 计数排序。

提前致谢。

【问题讨论】:

  • 我认为您最好的解决方案是将每个查询包装在 if() 语句中。如果记录数为 0,则运行下一个查询。
  • 但过滤器间隔存储在另一个表中,因此管理员可能会增加间隔数。例如。他可以为“过去一周”创建另一个过滤器。所以在这种情况下,我们需要在每次过滤器更改时修改查询
  • 如果他可以创建一个新过滤器,那么只需循环一个包含所有可能日期范围的查询
  • @balkon_smoke 你可以为每个表发布一些示例数据,然后通过过滤获得所需的结果吗?
  • @bluefeet 我更新了问题,请检查一下,我将非常感谢任何帮助

标签: mysql dateinterval


【解决方案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
            . . .
      )

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

【讨论】:

    【解决方案2】:

    如果您想要过去一小时的前 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。

    【讨论】:

      猜你喜欢
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 2012-12-09
      相关资源
      最近更新 更多