我有一個有近100個字段的數據庫。 DB結構是Mysql Order by Tweak
ID |評論|時間
我需要只獲取5 最新記錄(我可以使用ORDER BY時間DESC這些記錄)。但是,在打印它們時,我需要首先打印這5條記錄中最老的,然後以最後打印最新記錄的方式進行反轉。
我有一個有近100個字段的數據庫。 DB結構是Mysql Order by Tweak
ID |評論|時間
我需要只獲取5 最新記錄(我可以使用ORDER BY時間DESC這些記錄)。但是,在打印它們時,我需要首先打印這5條記錄中最老的,然後以最後打印最新記錄的方式進行反轉。
好吧,按升序排列與行
數量的限制獲取結果集之後你可以做到這一點才能打印以相反的順序(降序)
$data= array();
while ($row = mysql_fetch_assoc($result)) {
$data[] = $row;
}
$records = array_reverse($data);
OR
這可以用mysql_data_seek
直接從here
for ($i = mysql_num_rows($resultset) – 1; $i >= 0; $i–) {
mysql_data_seek($resultset, $i);
$row = mysql_fetch_assoc($result);
echo $row['abc'] . ' ' . $row['xyz'] . "\n";
}
您可以在結果列表中使用PHP的array_reverse()
函數。如果你有很多的訪問本聲明這將是更好的來代表它作爲物化視圖
select * from (select * from table_name where 1=1 order by time desc
limit 5) as tbl order by tbl.time;
編輯:
您還可以使用這樣的事情。儘管在mysql中沒有物化視圖,但可以模擬它們(http://lists.mysql.com/mysql/207808)
使用物化視圖或模擬物化視圖將嚴重超出建議的php方法。無論如何,大多數提到的消耗大量內存。
我想你可以沿(未經測試)的線做一些事情:
SELECT
*
FROM (
SELECT
id, comment, time
FROM
table
ORDER BY
time DESC
LIMIT 5
)
ORDER BY
time ASC
UPDATE
顯然, 「派生表必須有它自己的別名」(error #1248)。其他答案已經做到了,所以我會跳上這一行。下面你會發現修改過的(和測試過的)查詢:
SELECT
derived.*
FROM (
SELECT
id, comment, time
FROM
table
ORDER BY
time DESC
LIMIT 5
) AS derived
ORDER BY
derived.time ASC
順便提一句,這是supported as of MySQL 4.1。
SELECT s.* FROM (
SELECT id, comment, time FROM table1
ORDER BY time DESC
LIMIT 5) as s
ORDER BY s.time ASC