Làm thế nào tôi có thể làm một cái gì đó như thế này?
Hàng SQL CHỌN TỪ bảng WHERE id = max (id)
Làm thế nào tôi có thể làm một cái gì đó như thế này?
Hàng SQL CHỌN TỪ bảng WHERE id = max (id)
Câu trả lời:
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
id
chỉ là một cột trong bảng. Không có gì đảm bảo rằng các giá trị trong id
cột phải là duy nhất.
id
khô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.
id
có 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 profiles
và 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?
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 id
là 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 id
và bạn sẽ chỉ nhận được một hàng.
SELECT *
FROM table
WHERE id = (SELECT MAX(id) FROM TABLE)
SELECT entry FROM table WHERE id = MAX(id)
sẽ không hoạt động?!
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_time
mụ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
Bạn không thể đưa ra order by
vì order 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);
ORDER BY
sẽ không thực hiện quét toàn bộ nếu bạn cho rằng đó id
là 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.
Hãy thử với điều này
SELECT top 1 id, Col2, row_number() over (order by id desc) FROM Table
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 ().