按时间戳排序?

时间:2014-02-01 14:32:10

标签: php mysql timestamp

我正在我的网站上制作“最近捐款”标签。

我做了这样的查询:

$result = mysqli_query($con, "SELECT * FROM dc_donations ORDER BY DATE(dt) LIMIT 5");

但是今天我得到了新捐款。它似乎在最后放置了新的(所以新的,在最后订购)。我的理论是,它正常命令,2014-01-30,在2014-02-01之前。

表格的“dt”列是TIMESTAMP字段,自动填充CURRENT_TIMESTAMP

2 个答案:

答案 0 :(得分:1)

我发现您的查询可能存在两个问题。

 SELECT * 
   FROM dc_donations 
  ORDER BY DATE(dt)   /* slow and wrong ! */
  LIMIT 5

首先,您要存储一个完整的日期和时间,但是当您进行订购时,您只能按日期部分进行排序。这是DATE(dt)的作用。这会导致两个问题。 a)希望您在每个日历日内都有很多捐款,包括新到的捐款。 SQL排序的工作方式,如果您没有完全指定订单,则允许服务器无法预测(随机)订购商品。因此,您的查询将显示五个旧捐款的随机集合。 b)在ORDER BY子句中的列上使用函数会使该操作的索引失效。当您向上扩展时,这可能会减慢您的查询速度。

第二,你想要最近的五次捐款吗?如果是,请使用DESC。我相信你想要这个查询。

 SELECT * 
   FROM dc_donations 
  ORDER BY dt DESC
  LIMIT 5

专业提示:不要在生产软件中使用SELECT *。而是枚举您需要检索的列。

答案 1 :(得分:0)

问题是你没有定义你想要它的确切顺序(只有哪一列)。因此,MySQL错误地假设您需要ASC结束顺序(最小/最早的结束顺序)。

这可以通过简单地给出正确的顺序来解决:

SELECT * FROM dc_donations ORDER BY DATE(dt) DESC LIMIT 5

但由于dt已经是时间戳,您可以通过字段本身的排序来节省一些时间:

SELECT * FROM dc_donations ORDER BY dt DESC LIMIT 5