【问题标题】:Order By SQL request by time range period, then other criteria按时间范围的 SQL 请求排序,然后是其他条件
【发布时间】:2014-11-10 17:18:17
【问题描述】:

我有一张桌子,我们称之为posts,其中包含帖子。这些帖子有titlecontentdate(如timestamp)。他们可以被投票,因此分配给他们的投票数量是可变的。

我想要的是一种 SQL 方式来订购time range 的帖子,然后是upvote。所以基本上 SQL 请求必须返回:

  • 今天的帖子(假设时间范围是一天)按upvotes desc排序,然后是昨天的帖子按upvotes desc排序,等等...

是否可以在一个请求中做到这一点,实现它的最佳方法是什么?

【问题讨论】:

  • 能否请您分享您到目前为止的 SQL 语句,看看您是否接近?

标签: mysql sql-order-by


【解决方案1】:

您可以将多个列放入您的 ORDER BY 子句中,只要它们用逗号分隔即可。我认为您正在寻找这样的东西:

SELECT title, content, DATE(date) AS postDate, upvotes
FROM posts
ORDER BY postDate DESC, upvotes DESC;

这将把今天的日期放在第一位,然后把最高票数的帖子放在第一位。

那里的 DATE() 函数提取时间戳值的日期部分,我相信这是您想要的,因此无论时间如何,帖子都按日期本身放在一起。

虽然您说过帖子可以投票,但您没有将其列为您的专栏之一。我的回答假设 upvotes 是 post 表中的一列。如果不是,并且您不知道如何获得该值,请告诉我,我可以尽力帮助您。

【讨论】:

  • 耶!日期实际上是用于提取日期时间 sql 字段的日期部分。但是你让我上路了。解决方案是:ORDER BY DATE( FROM_UNIXTIME(timestamp)), upvotes。实际上,赞成票是对加入的计数,但我对此没有任何问题,非常感谢。
  • 太棒了,很高兴它成功了!你也教会了我一些新东西,我认为 DATE() 也适用于时间戳。
【解决方案2】:

这个 SQL 语句应该做/可以编辑你想要的:

SELECT *
FROM posts
ORDER BY 
    date DESC,   // Favour the newest date
    upvote DESC      // Now get the one with most upvotes

默认情况下,SQL 将它们按升序排序,而在您的情况下,您希望它们降序,因此需要 DESC。

在 ORDER BY 语句中的列名之间使用逗号 (,) 表示首先列出的列名优先,然后是下一个(等等...)。

【讨论】:

  • 其实这个是按时间戳排序的,给有相同时间戳的人点赞。这不是我要找的,但无论如何谢谢。
猜你喜欢
  • 2011-11-10
  • 2015-10-06
  • 1970-01-01
  • 1970-01-01
  • 2017-06-26
  • 2012-10-19
  • 2021-10-29
  • 1970-01-01
  • 2016-01-15
相关资源
最近更新 更多