Chọn hàng cuối cùng trong MySQL


181

Làm thế nào tôi có thể SELECThàng cuối cùng trong một bảng MySQL?

Tôi đang lấy INSERTdữ liệu và tôi cần lấy một giá trị cột từ hàng trước.

Có một cái auto_incrementtrong bàn.


8
Xác định "hàng cuối cùng". Người nào có ID cao nhất? Hoặc gần đây nhất được thêm vào?
EboMike

1
Điều gì chỉ ra hàng cuối cùng - Có cột auto_increment hoặc DATETIME trong bảng không?
Ngựa vằn OMG

Vâng, có một auto_incrementtrong đó. Tôi muốn một cái được thêm gần đây nhất.
esqew

9
Không có hàng cuối cùng trong một bộ, như EboMike và OMG Ponies nói. Bạn sẽ làm gì nếu tôi đưa cho bạn một túi đầy quả bóng và yêu cầu bạn đưa cho tôi quả bóng cuối cùng?
Vincent Savard

Câu trả lời:


402

Vâng, có một auto_increment trong đó

Nếu bạn muốn cuối cùng của tất cả các hàng trong bảng, thì đây cuối cùng là thời điểm mà MAX(id)câu trả lời đúng! Loại:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;

12
Tôi sợ rằng điều này sẽ chậm nếu cần sắp xếp hàng triệu hàng, phải không?
Slawa

2
Tôi chỉ chạy hàng này hơn 20m và nó rất nhanh. Tôi giả sử có một số trường hợp đặc biệt để xử lý truy vấn này. (EDIT: MySQL 5.7, công cụ InnoDB)
Daniel Buckmaster

1
@Pekka: Tôi không muốn sử dụng đơn hàng bởi, có lựa chọn nào khác để làm điều đó không?
Shiva

4
@Slawa Không nếu idđược lập chỉ mục.
Hầu tước Lorne

31

Hãy nhớ rằng các bảng trong cơ sở dữ liệu quan hệ chỉ là tập hợp các hàng. Và bộ trong toán học là bộ sưu tập không có thứ tự. Không có hàng đầu tiên hoặc cuối cùng; không có hàng trước hoặc hàng tiếp theo.

Trước tiên, bạn sẽ phải sắp xếp tập hợp các hàng không có thứ tự của mình theo một số trường và sau đó bạn sẽ tự do lặp lại thông qua tập kết quả theo thứ tự bạn đã xác định.

Vì bạn có trường tăng tự động, tôi giả sử bạn muốn đó là trường sắp xếp. Trong trường hợp đó, bạn có thể muốn làm như sau:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

Xem cách đầu tiên chúng tôi sắp xếp tập hợp các hàng không có thứ tự theo your_auto_increment_field(hoặc bất cứ thứ gì bạn có tên) theo thứ tự giảm dần. Sau đó, chúng tôi giới hạn các tập kết quả chỉ là hàng đầu tiên với LIMIT 1.


25

Bạn có thể kết hợp hai truy vấn được đề xuất bởi @spacepille thành một truy vấn giống như thế này:

SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);

Nó sẽ hoạt động nhanh, nhưng trên các bảng INNODB, nó chậm hơn một phần triệu giây so với ĐẶT HÀNG + GIỚI HẠN.


@karthikeyan đã viết câu trả lời của anh ấy bốn ngày trước và tôi đã trả lời câu hỏi này vào tháng 12 năm 2015.
vzr

Không, tôi đã chỉnh sửa và sửa một số cách viết 4 ngày trước ... ngày đăng là 2014 answered Jun 14 at 9:41khoảng 1 năm và 6 tháng trước đó :)
Dwza

Chỉ cần làm sạch không khí ở đây vzr là đúng. 'Ngày 14 tháng 6' có nghĩa là ngày 14 tháng 6 năm 2016 cũng @karthikeyan chỉ là thành viên được hai tháng tại thời điểm này.
Robert Brisita

Ssooo ... câu trả lời của @ karthikeyan là bản sao của câu trả lời này!
Cliff Burton

24

trên các bảng có nhiều hàng là hai truy vấn có thể nhanh hơn ...

SELECT @last_id := MAX(id) FROM table;

SELECT * FROM table WHERE id = @last_id;

6

Làm cho nó đơn giản sử dụng: PDO::lastInsertId

http://php.net/manual/en/pdo.lastinsertid.php


2
Đúng. Hầu hết các thư viện giao diện MySQL phong nha đều có các phương thức dành riêng cho việc này, tuy nhiên câu hỏi này không được gắn thẻ PHP mà là cú pháp chung của MySQL.
vzr

4

Nếu bạn muốn một cái được thêm gần đây nhất, hãy thêm dấu thời gian và chọn thứ tự ngược theo dấu thời gian cao nhất, giới hạn 1. Nếu bạn muốn đi theo ID, hãy sắp xếp theo ID. Nếu bạn muốn sử dụng cái bạn CHỈ thêm vào, hãy sử dụng mysql_insert_id.


4

Hầu như mọi bảng cơ sở dữ liệu, đều có cột auto_increment (thường là id)

Nếu bạn muốn cuối cùng của tất cả các hàng trong bảng,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

HOẶC LÀ

Bạn có thể kết hợp hai truy vấn thành một truy vấn giống như thế này:

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);

gia tăng tự động chỉ ở đó nếu DBA (hoặc bất kỳ ai thực hiện bảng) thực hiện gia tăng tự động
WhatsThePoint

2
SELECT * FROM adds where id=(select max(id) from adds);

Truy vấn này được sử dụng để lấy bản ghi cuối cùng trong bảng của bạn.


Bản sao câu trả lời dưới đây
Jbur43

2

Nhiều câu trả lời ở đây cũng nói như vậy (thứ tự tăng dần tự động của bạn), không sao, miễn là bạn có một cột tự động được lập chỉ mục.

Mặt khác, nếu bạn có trường như vậy và đó khóa chính, sẽ không có hình phạt về hiệu suất khi sử dụng order byso với select max(id). Khóa chính là cách dữ liệu được sắp xếp trong các tệp cơ sở dữ liệu (ít nhất là đối với InnoDB) và RDBMS biết dữ liệu đó kết thúc ở đâu và nó có thể tối ưu hóa order by id + limit 1giống như đạt đượcmax(id)

Bây giờ, con đường ít đi là khi bạn không có khóa chính tự động. Có thể khóa chính là khóa tự nhiên, là tổng hợp của 3 trường ... Tuy nhiên, không phải tất cả đều bị mất. Từ ngôn ngữ lập trình, trước tiên bạn có thể nhận được số lượng hàng với

SELECT Count(*) - 1 AS rowcount FROM <yourTable>;

và sau đó sử dụng số thu được trong LIMITmệnh đề

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

Thật không may, MySQL sẽ không cho phép truy vấn phụ hoặc biến người dùng trong LIMITmệnh đề


1

Bạn có thể sử dụng một OFFSETtrong một LIMITlệnh:

SELECT * FROM aTable LIMIT 1 OFFSET 99

trong trường hợp bảng của bạn có 100 hàng, hàng này sẽ trả về hàng cuối cùng mà không cần dựa vào tệp chính_key

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.