使用此代码我选择表格的前30行:
SELECT * FROM `table` LIMIT 0 , 30
但如何在不改变顺序的情况下选择最后30个?
答案 0 :(得分: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
实际上两次更改订单,恢复原始订单。
答案 1 :(得分:7)
由于您试图避免订购,因此解决方案是将其应用两次。
SELECT *
FROM (
SELECT *
FROM `table_name`
ORDER BY `column_name` DESC -- maybe id?
LIMIT 0, 30
) `table_aliase`
ORDER BY `column_name` ASC
答案 2 :(得分: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
答案 3 :(得分:3)
如果您有自动增量键/列,请说id
,这是一个示例
SELECT * FROM `table` ORDER BY id DESC LIMIT 0 , 30;
答案 4 :(得分:1)
也许这会奏效:select * from table WHERE id > ((SELECT MAX(id) from table) - 30);
答案 5 :(得分:0)
没有关于订单的说法,因此您不能使用ORDER BY。 有一种方法可以从给定的点获取记录,但为此您需要知道有多少记录,然后使用此计数值来提供限制
SELECT COUNT(*) AS counted FROM table
SELECT * FROM table LIMIT (counted-30),30
答案 6 :(得分: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);