Làm thế nào để chọn bản ghi cuối cùng của bảng trong SQL?


133

Đây là một mã mẫu để chọn tất cả các bản ghi từ một bảng. Ai đó có thể chỉ cho tôi cách chọn bản ghi cuối cùng của bảng đó không?

select * from table

Khi tôi sử dụng: SELECT * FROM TABLE ORDER BY ID DESC LIMIT Tôi gặp lỗi này: Dòng 1: Cú pháp không chính xác gần 'GIỚI HẠN'. Đây là mã tôi sử dụng:

private void LastRecord()
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["HELPDESK_OUTLOOKConnectionString3"].ToString());

    conn.Open();
    SqlDataReader myReader = null;
    SqlCommand myCommand = new SqlCommand("SELECT * FROM HD_AANVRAGEN ORDER BY " +
                "aanvraag_id DESC LIMIT 1", conn);
    myReader = myCommand.ExecuteReader();
    while (myReader.Read())
    {
        TextBox1.Text = (myReader["aanvraag_id"].ToString());
        TextBox1.Text += (myReader["wijziging_nummer"].ToString());
        TextBox1.Text += (myReader["melding_id"].ToString());
        TextBox1.Text += (myReader["aanvraag_titel"].ToString());
        TextBox1.Text += (myReader["aanvraag_omschrijving"].ToString());
        TextBox1.Text += (myReader["doorlooptijd_id"].ToString());
        TextBox1.Text += (myReader["rapporteren"].ToString());
        TextBox1.Text += (myReader["werknemer_id"].ToString());
        TextBox1.Text += (myReader["outlook_id"].ToString());
    }
}

Vâng, bạn phải đặt hàng trên một cái gì đó. Bạn có khóa chính không? Có lẽ là một ID?
alexn

Bạn có ý nghĩa gì bởi "hồ sơ cuối cùng"? Với giá trị cao nhất của cột khóa chính?
Marcin Classicalblewski

Câu trả lời:


337

Không có thêm thông tin, Cơ sở dữ liệu nào tốt nhất chúng ta có thể làm là một cái gì đó như

Máy chủ Sql

SELECT TOP 1 * FROM Table ORDER BY ID DESC

MySql

SELECT * FROM Table ORDER BY ID DESC LIMIT 1

1
top 1 sẽ lấy cái đầu tiên chứ?
Tassisto

30
Có, nhưng đó là lý do tại sao bạn đặt hàng bởi DESC
Adriaan Stander

3
Nhưng nếu bạn đã sử dụng đơn đặt hàng của DESC cho một triệu bản ghi, nó sẽ làm chậm truy vấn của bạn @AdriaanStander
Charles Hernandez

1
Một mysql cũng hoạt động với máy chủ sql. Đó là một lệnh sql chung.
azhar22k

1
@ itz-azhar: dạng MySQL của truy vấn này không phải là lệnh SQL chung; các LIMITtừ khóa là một phần mở rộng của SQL mà chỉ có một số RDBMSes thực hiện; Đáng chú ý, Oracle không có LIMITtừ khóa
Landru27

23

Giả sử bạn có một cột Id:

SELECT TOP 1 *
  FROM table
 ORDER
    BY Id DESC;

Ngoài ra, điều này sẽ hoạt động trên SQL Server. Tôi nghĩ rằng MySQL bạn có thể cần phải sử dụng:

SELECT *
  FROM table
 ORDER
    BY Id DESC
 LIMIT 1

Nhưng, tôi không chắc chắn 100% về điều này.

BIÊN TẬP

Nhìn vào các câu trả lời khác, tôi hiện tin tưởng 100% rằng tôi đúng với tuyên bố của MySQL: o)

BIÊN TẬP

Chỉ cần nhìn thấy bình luận mới nhất của bạn. Bạn có thể làm:

SELECT MAX(Id)
  FROM table

Điều này sẽ giúp bạn có số Id cao nhất.


2
CHỌN MAX (id) TỪ dữ liệu Hoạt động hoàn hảo!
Ricardo Fercher

15

để có được hàng cuối cùng của Cơ sở dữ liệu SQL, hãy sử dụng chuỗi sql này:

SELECT * FROM TableName WHERE id=(SELECT max(id) FROM TableName);

Đầu ra:

Dòng cuối cùng của db của bạn!


3
Hoạt động hoàn toàn tốt với
orory

Điều này là tốt nhất. Không sắp xếp, không "TOP 1", chỉ hỗ trợ và truy vấn hiệu suất. Hoàn hảo.
Matt F.

7
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

Vâng, đây là mysql, SQL Server:

SELECT TOP 1 * FROM Table ORDER BY ID DESC

Điều này cho một lỗi! Tôi nghĩ rằng đây là SQL nhưng đó là MySQL
Tassisto

1
Đã chỉnh sửa vào SQL Server, tuy nhiên bạn không chỉ định DBMS của mình trong câu hỏi.
Simon

3
SELECT * FROM table ORDER BY Id DESC LIMIT 1

2

Cuối cùng chỉ là lần đầu tiên khi bạn đảo ngược thứ tự của bạn.


0

Trong Oracle, bạn có thể làm:

SELECT *
FROM (SELECT EMP.*,ROWNUM FROM EMP ORDER BY ROWNUM DESC)
WHERE ROWNUM=1;

Đây là một trong những cách có thể.


0
select ADU.itemid, ADU.startdate, internalcostprice 
from ADUITEMINTERNALCOSTPRICE ADU

right join

   (select max(STARTDATE) as Max_date, itemid 
   from ADUITEMINTERNALCOSTPRICE
   group by itemid) as A

on A.ITEMID = ADU.ITEMID
and startdate= Max_date

1
Chào mừng đến với stackoverflow. Ngoài câu trả lời bạn đã cung cấp, vui lòng xem xét việc cung cấp giải thích ngắn gọn về lý do và cách khắc phục sự cố này.
jtate

0

Thiết kế bảng của bạn luôn có một định danh hàng tự động, chẳng hạn như

 [RowID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL

, sau đó bạn có thể xác định hàng cuối cùng của mình bằng cách

 select * from yourTable where rowID =  @@IDENTITY 

0

Tôi nghĩ rằng điều này nên làm điều đó.

declare @x int;
select @x = max(id) from table_name;
select * from where id = @x;

0

Nếu bạn có một trường tự tăng (giả sử ID) thì bạn có thể làm một cái gì đó như: SELECT * FROM foo WHERE ID = (SELECT max(ID) FROM foo)


-1
$sql="SELECT tot_visit FROM visitors WHERE date = DATE(NOW()) - 1 into @s                
$conn->query($sql);
$sql = "INSERT INTO visitors (nbvisit_day,date,tot_visit) VALUES (1,CURRENT_DATE,@s+1)";
$conn->query($sql);

bạn đã đọc kỹ câu hỏi chưa? làm thế nào để INSERT"một giá trị mới liên quan đến" cách chọn bản ghi cuối cùng của bảng đó "?
Landru27

2
Chào mừng bạn đến với Stack Overflow! Cảm ơn bạn về đoạn mã, có thể cung cấp một số trợ giúp hạn chế, ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách mô tả lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những người đọc tương lai với những câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện.
sepehr

Đừng viết mã cụ thể của php khi OP chỉ hỏi về ngôn ngữ SQL.
steve moretz


-1

Tôi ủng hộ Ricardo. Trên thực tế max là hiệu quả hơn nhiều so với sắp xếp. Xem sự khác biệt. nó là tuyệt vời.

Tôi đã phải lấy hàng / bản ghi cập nhật cuối cùng (timeStamp)

`sqlite> select timeStamp from mypadatav2 order by timeStamp desc limit 1;
 2020-03-11 23:55:00
 Run Time: real 1.806 user 1.689242 sys 0.117062`

`sqlite> select max(timeStamp) from mypadatav2;
 2020-03-11 23:55:00
 Run Time: real 0.553 user 0.412618 sys 0.134340`
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.