我正在我的网站上制作“最近捐款”标签。
我做了这样的查询:
$result = mysqli_query($con, "SELECT * FROM dc_donations ORDER BY DATE(dt) LIMIT 5");
但是今天我得到了新捐款。它似乎在最后放置了新的(所以新的,在最后订购)。我的理论是,它正常命令,2014-01-30
,在2014-02-01
之前。
表格的“dt”列是TIMESTAMP
字段,自动填充CURRENT_TIMESTAMP
。
答案 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