2011-06-30 69 views
1

我有一個有近100個字段的數據庫。 DB結構是Mysql Order by Tweak

ID |評論|時間

我需要只獲取5 最新記錄(我可以使用ORDER BY時間DESC這些記錄)。但是,在打印它們時,我需要首先打印這5條記錄中最老的,然後以最後打印最新記錄的方式進行反轉。

回答

1

好吧,按升序排列與行

數量的限制獲取結果集之後

你可以做到這一點才能打印以相反的順序(降序)

$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"; 
} 
1

您可以在結果列表中使用PHP的array_reverse()函數。如果你有很多的訪問本聲明這將是更好的來代表它作爲物化視圖

select * from (select * from table_name where 1=1 order by time desc 
limit 5) as tbl order by tbl.time; 

編輯:

http://php.net/manual/en/function.array-reverse.php

0

您還可以使用這樣的事情。儘管在mysql中沒有物化視圖,但可以模擬它們(http://lists.mysql.com/mysql/207808

使用物化視圖或模擬物化視圖將嚴重超出建議的php方法。無論如何,大多數提到的消耗大量內存。

0

我想你可以沿(未經測試)的線做一些事情:

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

2
SELECT s.* FROM (
    SELECT id, comment, time FROM table1 
    ORDER BY time DESC 
    LIMIT 5) as s 
ORDER BY s.time ASC