2012-03-19 105 views
2

与此代码我选择表的第一行30:如何选择MySQL中的最后n行?

SELECT * FROM `table` LIMIT 0 , 30 

但如何选择最后一个30,在不改变顺序?

+2

这里你没有任何顺序。 – 2012-03-19 19:50:52

+2

您的表格是否有可用于按顺序放置数据的字段(或多个字段)?也许是一个TIMESTAMP列或一个自动递增的INT列? – 2012-03-19 19:53:15

回答

10

看起来每个人都缺少这一部分:

但如何选择最后一个30,在不改变顺序?

首先,显然在提供的查询中没有顺序。假设该命令是一些外地上升,这将是查询@DannyFox意味着:

SELECT * FROM T 
ORDER BY val 
LIMIT 0 , 30 

现在想象一下,我们已经简化了数据,如a, b, c, d, e和我们想只有3行,而不是30:

SELECT * FROM T 
ORDER BY val 
LIMIT 3 

如果这在每一行中返回:a, b, c, d, e,那么他预计按照该顺序得到c, d, e。大家正在提供的查询:

SELECT * FROM T 
ORDER BY val desc 
LIMIT 3 

会返回e, d, c。问题在于它实际上改变了原来的订单,并且OP表示他不想改变订单。因此从技术上讲,这将导致c, d, e查询是:

select * from (
    select * from t 
    order by val desc 
    limit 3 
) s 
order by val 

这实际上改变了顺序两次,获得原始订单回来。

+0

看起来像我打败你,但像我这样思考+1。 :) – Shef 2012-03-19 20:15:55

+0

哈哈,为你+1也:) – 2012-03-19 20:17:59

1

也许这将工作:select * from table WHERE id > ((SELECT MAX(id) from table) - 30);

+1

如果删除了最后30条记录中的某些记录,并且id为自动增量,则结果将少于30条。 – 2012-03-19 19:53:40

+4

是的,这可能很大,特别是如果ID之间存在差距。 “ORDER BY”条款是专业解决方案,仅此而已。 – Shef 2012-03-19 19:53:49

+2

这个答案假设了很多关于表格的组成。 – 2012-03-19 19:54:20

3

如果你有一个自动增量键/列,说id那么这里有一个例子

SELECT * FROM `table` ORDER BY id DESC LIMIT 0 , 30; 
4

首先,你需要指定一个顺序:

SELECT * FROM table 
ORDER BY some_id ASC -- ascending order 
LIMIT 30 

如果该查询返回前30列,则该列将返回最后30列:

SELECT * FROM table 
ORDER BY some_id DESC -- descending order 
LIMIT 30 
7

既然你要设法避免订货,那么解决办法是申请两次了。

SELECT * 
    FROM (
      SELECT * 
       FROM `table_name` 
      ORDER BY `column_name` DESC -- maybe id? 
      LIMIT 0, 30 
     ) `table_aliase` 
ORDER BY `column_name` ASC 
0

没有关于订单的说法,所以您不能使用ORDER BY。 有一种方式来获得一个给定的点记录,但你需要知道有多少记录有,然后使用此计数值提供极限

SELECT COUNT(*) AS counted FROM table 

SELECT * FROM table LIMIT (counted-30),30 
0

这里与PHP中使用我的方法:

$query = "SELECT * FROM table ORDER BY id DESC LIMIT 3"; 
$res = mysql_query($query); 
$results = array(); 
while($row = mysql_fetch_assoc($res)){ 
    $results = $row[field]; 
} 
// Back to original order based from DB 
$results = array_reverse(results);