จะเลือกระเบียนสุดท้ายของตารางใน SQL ได้อย่างไร?


133

นี่คือโค้ดตัวอย่างเพื่อเลือกระเบียนทั้งหมดจากตาราง ใครช่วยแสดงวิธีเลือกระเบียนสุดท้ายของตารางนั้นได้ไหม

select * from table

เมื่อฉันใช้: SELECT * FROM TABLE ORDER BY ID DESC LIMIT ฉันได้รับข้อผิดพลาดนี้: บรรทัดที่ 1: ไวยากรณ์ไม่ถูกต้องใกล้ 'LIMIT' นี่คือรหัสที่ฉันใช้:

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());
    }
}

คุณต้องสั่งอะไรสักอย่าง คุณมีคีย์หลักหรือไม่? อาจจะเป็น ID?
เล็กซ์

คุณหมายถึงอะไร "last record"? ด้วยค่าสูงสุดของคอลัมน์คีย์หลัก?
Marcin Wroblewski

คำตอบ:


338

หากไม่มีข้อมูลเพิ่มเติมฐานข้อมูลใดที่ดีที่สุดที่เราทำได้ก็คือ

SQL เซิร์ฟเวอร์

SELECT TOP 1 * FROM Table ORDER BY ID DESC

MySql

SELECT * FROM Table ORDER BY ID DESC LIMIT 1

1
top 1 จะเอาคนแรกไม่ใช่เหรอ
Tassisto

30
ใช่ แต่นั่นคือเหตุผลที่คุณสั่งโดยDESC
Adriaan Stander

3
แต่ถ้าคุณใช้คำสั่งโดย DESC เป็นล้านระเบียนมันจะทำให้การค้นหาของคุณช้าลง @AdriaanStander
Charles Hernandez

1
mysql one ยังทำงานร่วมกับเซิร์ฟเวอร์ sql มันเป็นคำสั่ง sql ทั่วไป
azhar22k

1
@ itz-azhar: รูปแบบ MySQL ของแบบสอบถามนี้ไม่ใช่คำสั่ง SQL ทั่วไป LIMITคำหลักที่เป็นส่วนขยายของ SQL ว่ามีเพียงบาง RDBMSes ใช้; โดยเฉพาะ Oracle ไม่มีLIMITคีย์เวิร์ด
landru27

23

สมมติว่าคุณมีคอลัมน์ Id:

SELECT TOP 1 *
  FROM table
 ORDER
    BY Id DESC;

นอกจากนี้สิ่งนี้จะทำงานบน SQL Server ฉันคิดว่า MySQL คุณอาจต้องใช้:

SELECT *
  FROM table
 ORDER
    BY Id DESC
 LIMIT 1

แต่ฉันไม่แน่ใจ 100% เกี่ยวกับเรื่องนี้

แก้ไข

ดูคำตอบอื่น ๆ ตอนนี้ฉันมั่นใจ 100% แล้วว่าฉันถูกต้องกับคำสั่ง MySQL: o)

แก้ไข

เพิ่งเห็นความคิดเห็นล่าสุดของคุณ คุณสามารถทำได้:

SELECT MAX(Id)
  FROM table

ซึ่งจะทำให้คุณได้รับหมายเลขประจำตัวสูงสุด


2
เลือก MAX (id) จากข้อมูลทำงานได้อย่างสมบูรณ์แบบ!
Ricardo Fercher

15

เพื่อรับแถวสุดท้ายของฐานข้อมูล SQL ให้ใช้สตริง sql นี้:

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

เอาท์พุท:

บรรทัดสุดท้ายของฐานข้อมูลของคุณ!


3
ทำงานได้ดีกับ oracle ด้วยและเร็วกว่าการเรียงลำดับ
MaKiPL

อันนี้ดีที่สุด ไม่มีการจัดเรียงไม่มี "TOP 1" มีเพียงข้อความค้นหาที่ได้รับการสนับสนุนและมีประสิทธิภาพ สมบูรณ์
Matt F.

7
SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1

ใช่นี่คือ mysql, SQL Server:

SELECT TOP 1 * FROM Table ORDER BY ID DESC

สิ่งนี้ทำให้เกิดข้อผิดพลาด! ฉันคิดว่านี่คือ SQL แต่เป็น MySQL
Tassisto

1
แก้ไขไปยัง SQL Server แต่คุณไม่ได้ระบุ DBMS ของคุณในคำถาม
Simon

3
SELECT * FROM table ORDER BY Id DESC LIMIT 1

2

สุดท้ายเป็นเพียงรายการแรกเมื่อคุณย้อนกลับการสั่งซื้อของคุณ


1

เป็นแนวทางปฏิบัติที่ดีในการออกแบบตารางของคุณที่จะมีตัวระบุแถวอัตโนมัติเช่น

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

จากนั้นคุณสามารถระบุแถวสุดท้ายของคุณโดย

 select * from yourTable where rowID =  @@IDENTITY 

1
นี่เป็นเคล็ดลับที่ยอดเยี่ยมสำหรับการบันทึก 2 ล้านครั้งนั้นเร็วมาก (อย่างน้อยก็ในกรณีของฉัน) ขอบคุณ
Jeancarlo Fontalvo

0

ใน Oracle คุณสามารถทำ:

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

นี่เป็นวิธีหนึ่งที่เป็นไปได้


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
ยินดีต้อนรับสู่ stackoverflow นอกเหนือจากคำตอบที่คุณให้ไว้โปรดพิจารณาอธิบายสั้น ๆ ว่าเหตุใดจึงแก้ไขปัญหานี้ได้อย่างไร
jtate


0

หากคุณมีฟิลด์ที่เพิ่มขึ้นเอง (พูดID) คุณสามารถทำสิ่งต่อไปนี้: 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);

คุณอ่านคำถามอย่างละเอียดหรือไม่ วิธีการที่ไม่INSERT'ไอเอ็นจีค่าใหม่ที่เกี่ยวข้องกับ 'วิธีการเลือกระเบียนสุดท้ายของตารางที่'?
landru27

2
ยินดีต้อนรับสู่ Stack Overflow! ขอขอบคุณสำหรับข้อมูลโค้ดซึ่งอาจให้ความช่วยเหลือแบบ จำกัด และทันท่วงที คำอธิบายที่เหมาะสมจะช่วยเพิ่มมูลค่าในระยะยาวได้อย่างมากโดยการอธิบายว่าเหตุใดจึงเป็นวิธีแก้ปัญหาที่ดีและจะทำให้มีประโยชน์มากขึ้นสำหรับผู้อ่านในอนาคตที่มีคำถามอื่น ๆ ที่คล้ายคลึงกัน โปรดแก้ไขคำตอบของคุณเพื่อเพิ่มคำอธิบายรวมถึงสมมติฐานที่คุณตั้งขึ้น
ก.ย.

อย่าเขียนโค้ดเฉพาะ php เมื่อ OP ถามเกี่ยวกับภาษา SQL เท่านั้น
steve moretz


-1

ฉันโหวตให้ Ricardo จริงๆแล้ว max มีประสิทธิภาพมากกว่าการเรียงลำดับ ดูความแตกต่าง มันยอดเยี่ยมมาก

ฉันต้องได้รับแถวสุดท้าย / บันทึกการอัปเดต (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`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.