2011-06-30 70 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