簡體   English   中英

在不改變表結構的情況下,選擇表中最后n行的最有效方法是什么?

[英]What's the most efficient way to select the last n rows in a table without changing the table's structure?

使用mySQL選擇表中最后n行的最有效方法是什么? 該表包含數百萬行,並且在任何給定時間我都不知道該表有多大(它在不斷增長)。 該表有一個自動遞增的列,並用作每行的唯一標識符。

SELECT * FROM table_name ORDER BY auto_incremented_id DESC LIMIT n

實際上,按順序獲取最后n行的正確方法是使用子查詢:

(SELECT id, title, description FROM my_table ORDER BY id DESC LIMIT 5) 
ORDER BY tbl.id ASC

因為這種方式是我所知道的,它將以正確的順序返回它們。 接受的答案實際上是“ 從按降序ID排序的集合中選擇前5行 ”的解決方案,但這很可能是您需要的。

也許按唯一ID降序排序:

SELECT * FROM table ORDER BY id DESC LIMIT n

唯一的問題是你可能想要以不同的順序選擇,這個問題讓我必須通過計算行數來選擇最后一行,然后使用LIMIT選擇它們,但顯然這可能不是一個好的解決方案在你的情況下。

(類似於“marco”的回答,)
我最喜歡的是max() - MySQL的功能,簡單的單線程 ,但還有其他方法可以確定:

SELECT whatever FROM mytable WHERE id > (SELECT max(id)-10 FROM mytable);

...並且你得到“最后一個減去10”,通常是該表的最后10個條目。

這是一個簡短的方法,避免錯誤1111(“無效使用組函數”),不僅僅是有一個auto_increment-row(這里是id)。
max() - 函數可以多種方式使用。

使用ORDER BY按DESC順序按標識符列排序,並使用LIMIT指定所需的結果數。

你可能還想要添加一個降序索引(或者在mysql中調用它們的任何東西),以便在你經常要做的事情時快速選擇。

當你有大表時,這要快得多,因為你不必訂購整個表。 您只需將id用作唯一的行標識符。 當您在某些列中存在大量數據(例如圖像(blob))時,這也更有效。 在這種情況下,訂單可能非常耗費時間和數據。

select * 
from TableName 
where id > ((select max(id) from TableName)-(NumberOfRowsYouWant+1)) 
order by id desc|asc

唯一的問題是如果刪除所需間隔中的行。 在這種情況下,你不會得到真正的“NumberOfRowsYouWant”。

當您需要在多個網頁中向后顯示表格時,您還可以輕松地使用此選項為每個頁面選擇n行,只需將(NumberOfRowsYouWant + 1)乘以頁碼。

您可以在此處根據需要更改表名和列名。 如果你想顯示最后10行,那么根據你的要求把n = 10,或n = 20,或n = 30 ......等。

select * from(select * from employee order by emp_id desc limit n)a order by emp_id asc;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM