Làm cách nào để chọn toàn bộ một hàng có ID lớn nhất trong bảng?


Câu trả lời:


228

Bạn có thể sử dụng một mục phụ:

SELECT row 
FROM table 
WHERE id=(
    SELECT max(id) FROM table
    )

Lưu ý rằng nếu giá trị của max(id)không phải là duy nhất, nhiều hàng được trả về.

Nếu bạn chỉ muốn một hàng như vậy, hãy sử dụng câu trả lời của @ MichaelMior,

SELECT row from table ORDER BY id DESC LIMIT 1

6
@AlirezaSoori: Mặc dù tên, idchỉ là một cột trong bảng. Không có gì đảm bảo rằng các giá trị trong idcột phải là duy nhất.
unutbu

1
@unutbu Giả sử đó idkhông phải là khóa chính hoặc khóa duy nhất :) Đặt tên, có cơ hội hợp lý là như vậy. Cũng đáng lưu ý rằng tùy thuộc vào DBMS bạn đang sử dụng, cách tiếp cận với phần phụ có thể kém hiệu quả hơn nhiều.
Michael Mior

3
@MichaelMior: idcó thể là khóa ngoại, trong trường hợp đó có thể không phải là duy nhất. Tôi đã thực hiện một số điểm chuẩn bằng cách sử dụng set profiling = 1; ...; show profilesvà có vẻ như các giải pháp của chúng tôi có cùng hiệu suất sử dụng MySQL. Đối với kiến ​​thức của riêng tôi, bạn có biết DBMS nào có hiệu năng kém hơn cho các mục phụ không?
unutbu

1
Nó có thể là một khóa ngoại, nhưng như tôi đã nói, tôi chỉ đoán dựa trên tên mà nó không phải. MySQL trong lịch sử được biết là có hiệu suất xấu với các phần phụ. Điều đó đã được cải thiện rất nhiều trong các phiên bản mới hơn, vì vậy phụ thuộc vào phiên bản bạn đang sử dụng. Tuy nhiên, xem xét lại nó, truy vấn cụ thể này có thể ổn. Mặc dù chạy một truy vấn một vài lần với hồ sơ không nhất thiết phải nói nhiều về hiệu suất tương đối.
Michael Mior

149

Bạn cũng có thể làm

SELECT row FROM table ORDER BY id DESC LIMIT 1;

Điều này sẽ sắp xếp các hàng theo ID của chúng theo thứ tự giảm dần và trả về hàng đầu tiên. Điều này giống như trả về hàng với ID tối đa. Điều này tất nhiên giả định idlà duy nhất trong số tất cả các hàng. Nếu không, có thể có nhiều hàng với giá trị tối đa idvà bạn sẽ chỉ nhận được một hàng.


Để đặc biệt làm những gì OP yêu cầu, tôi sẽ làm điều này. Nhưng các câu trả lời khác cung cấp một nền giáo dục tốt hơn về cấu trúc SQL :)
MatBailie

@Dems Làm sao vậy? Không có lời giải thích được đưa ra trên bất kỳ câu trả lời khác? Tất nhiên tôi cũng có tội về điều đó :(
Michael Mior

Chỉ cần các câu hỏi khác sửa lỗi cú pháp mà không tái cấu trúc logic. Vì vậy, OP học cách phát biểu sql cụ thể đó một cách chính xác.
MatBailie

Điểm công bằng :) Mặc dù các câu trả lời khác được cho là vẫn đang sửa lỗi logic.
Michael Mior

Hiệu suất thì sao? Tôi đã đến đây với loại truy vấn này đã làm việc cho tôi, nhưng tôi tự hỏi liệu đó có phải là cách đúng đắn. Không phải là thứ tự bởi một hoạt động O (n * log n)?
khó khăn

27
SELECT * 
FROM table 
WHERE id = (SELECT MAX(id) FROM TABLE)

@ shA.t SELECT entry FROM table WHERE id = MAX(id)sẽ không hoạt động?!
oldboy

@ shA.t Ngoài ra, những gì tôi đang cố gắng làm một cái gì đó như sau: SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email)theo đó tôi chỉ cần entry_timemục nhập gần đây nhất trong cơ sở dữ liệu. Câu nói đó có đủ hay không:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
oldboy

Không có ý nghĩa đáng tin cậy cho hầu hết các mục gần đây trong kết quả truy vấn, bạn cần có một trường cho thời gian chèn, v.v. BTW, xin vui lòng đặt câu hỏi của bạn một cách riêng biệt, tôi hy vọng bạn sẽ nhận được nhiều sự chú ý hơn -HTH;).
shA.t

17

Bạn không thể đưa ra order byorder by"quét toàn bộ" trên bàn.

Các truy vấn sau là tốt hơn:

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

18
ORDER BYsẽ không thực hiện quét toàn bộ nếu bạn cho rằng đó idlà khóa chính của bảng. (Và nếu không, nó được đặt tên khá kém.) Nếu không, bạn dự kiến MAX(id)sẽ làm việc như thế nào nếu không quét toàn bộ bảng? Nếu không có chỉ mục, mọi giá trị vẫn phải được kiểm tra để tìm mức tối đa.
Michael Mior

@CakeLikeBoss Tôi thực sự đã thử truy vấn "order by" và "CHỌN * TỪ bảng WHERE id = (CHỌN MAX (id) TỪ bảng);" truy vấn trên một bảng gồm 114 hàng trong khi truy vấn này mất chính xác 0,0004 giây mỗi lần trong khi truy vấn thứ hai mất từ ​​0,0007 đến 0,0010 giây tôi đã lặp lại điều này nhiều lần
prabhjot

0

Hãy thử với điều này

 SELECT top 1  id, Col2,  row_number() over (order by id desc)  FROM Table

9
Từ khóa TOP không hoạt động trong MySQL. Truy vấn này sẽ không hoạt động.
Anirudha Gupta

@toddmo: MySQL! Và Sql-Server cũng không hữu ích cho người khác. Ý bạn là MS-SQL?
raiserle

@raiserle, bạn có thể giúp tôi tìm nơi tôi nhận xét hoặc đăng bất cứ điều gì về câu hỏi này không? Tôi không thể thấy tên mình gắn liền với câu hỏi này ở bất cứ đâu.
chập chững

0

Người ta luôn có thể sử dụng các chức năng phân tích, điều này sẽ giúp bạn kiểm soát nhiều hơn

select tmp.row from ( select row, rank() over(partition by id order by id desc ) as rnk from table) tmp where tmp.rnk=1

Nếu bạn gặp phải vấn đề với hàm rank () tùy thuộc vào loại dữ liệu thì người ta có thể chọn từ row_number () hoặc dense_rank ().

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.