2011-06-30 13 views
1

私はほぼ100のフィールドを持つデータベースを持っています。 DB構造はMysql Tweak by

id |コメント|時間

私は唯一の5 最新レコードをフェッチする必要が

(私は時間DESCでORDERを使用してそれらのレコードを取得することができます)。しかし、それらを印刷している間、私はこれらの5つのレコードのうち最も古いものを最初に印刷し、最新のレコードが最後に印刷されるように逆に進める必要があります。

答えて

1

の数の上限を昇順で結果セットをフェッチした後、あなたは(降順)逆の順序でそれらを印刷し、これを行うことができ、[OK]を

$data= array(); 
while ($row = mysql_fetch_assoc($result)) { 
    $data[] = $row; 
} 

$records = array_reverse($data); 

OR

これは、直接here

から取ら mysql_data_seek

で行うことができる

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