2012-03-19 104 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);