ฉันจะเลือกทั้งแถวที่มี ID มากที่สุดในตารางได้อย่างไร


141

คำตอบ:


228

คุณสามารถใช้การเลือกย่อย:

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

โปรดทราบว่าถ้าค่าของmax(id)ไม่ซ้ำกันหลายแถวจะถูกส่งกลับ

หากคุณต้องการเพียงแถวเดียวให้ใช้คำตอบของ @ MichaelMior

SELECT row from table ORDER BY id DESC LIMIT 1

6
@AlirezaSoori: แม้จะมีชื่อ แต่idเป็นเพียงคอลัมน์ในตาราง ไม่รับประกันว่าค่าในidคอลัมน์จะต้องไม่ซ้ำกัน
unutbu

1
@ unutbu สมมติว่าidไม่ใช่คีย์หลักหรือรหัสเฉพาะ :) ด้วยชื่อมีโอกาสที่สมเหตุสมผล นอกจากนี้ยังเป็นที่น่าสังเกตว่าขึ้นอยู่กับ DBMS ที่คุณใช้วิธีการเลือกย่อยอาจมีประสิทธิภาพน้อยกว่ามาก
Michael Mior

3
@MichaelMior: idอาจเป็นคีย์ต่างประเทศซึ่งในกรณีนี้อาจไม่ซ้ำกัน ฉันใช้การเปรียบเทียบset profiling = 1; ...; show profilesและปรากฏว่าโซลูชันของเรามีประสิทธิภาพการทำงานที่เหมือนกันโดยใช้ MySQL สำหรับความรู้ของฉันเองคุณรู้หรือไม่ว่า DBMS มีประสิทธิภาพที่ต่ำกว่าสำหรับการเลือกย่อยหรือไม่
unutbu

1
อาจเป็นคีย์ต่างประเทศ แต่อย่างที่ฉันบอกว่าฉันแค่เดาตามชื่อที่ไม่ใช่ เป็นที่ทราบกันดีว่าในอดีต MySQL มีประสิทธิภาพที่ไม่ดีเมื่อเลือกย่อย ซึ่งมีการปรับปรุงอย่างมากมายในเวอร์ชันใหม่กว่าดังนั้นขึ้นอยู่กับเวอร์ชันที่คุณใช้ อย่างไรก็ตามการพิจารณาใหม่เคียวรีเฉพาะนี้อาจตกลง แม้ว่าการเรียกใช้แบบสอบถามสองครั้งด้วยการทำโปรไฟล์ไม่จำเป็นต้องพูดถึงประสิทธิภาพที่เกี่ยวข้องมากนัก
Michael Mior

149

คุณสามารถทำได้

SELECT row FROM table ORDER BY id DESC LIMIT 1;

นี่จะเรียงลำดับแถวตาม ID ของพวกเขาในลำดับถัดลงมาและกลับไปแถวแรก นี่เหมือนกับการส่งคืนแถวด้วย ID สูงสุด แน่นอนนี้ถือว่าidเป็นสิ่งที่ไม่ซ้ำกันในทุกแถว มิฉะนั้นอาจมีหลายแถวที่มีค่าสูงสุดidและคุณจะได้รับเพียงแถวเดียว


ในการทำสิ่งที่ OP ขอมาโดยเฉพาะฉันจะทำสิ่งนี้ แต่คำตอบอื่น ๆ จะให้การศึกษาที่ดีขึ้นในโครงสร้าง SQL :)
MatBailie

@Dems เป็นอย่างไร ไม่มีคำอธิบายใด ๆ สำหรับคำตอบอื่น ๆ ฉันแน่นอนว่ามีความผิดเช่นกัน :(
Michael Mior

เพียงแค่คำถามอื่น ๆ ที่แก้ไขไวยากรณ์โดยไม่ต้องปรับโครงสร้างตรรกะ ดังนั้น OP จึงเรียนรู้วิธีระบุ sql นั้นอย่างถูกต้อง
MatBailie

จุดยุติธรรม :) แม้ว่าคำตอบอื่น ๆ ยังคงแก้ไขตรรกะ
Michael Mior

แล้วประสิทธิภาพล่ะ ฉันได้มาที่นี่พร้อมกับคำถามชนิดนี้แล้วทำงานให้ฉัน แต่ฉันสงสัยว่าเป็นวิธีที่เหมาะสม การสั่งซื้อ O ไม่ใช่การดำเนินการ O (n * log n) ใช่ไหม
dhill

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

@ shA.t ใช้SELECT entry FROM table WHERE id = MAX(id)งานไม่ได้!
oldboy

@ shA.t นอกจากนี้สิ่งที่ฉันพยายามทำบางอย่างเช่นต่อไปนี้: SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email)โดยที่ฉันต้องการentry_timeรายการล่าสุดในฐานข้อมูล ข้อความนั้นเพียงพอหรือควรเป็น:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
oldboy

ไม่มีความหมายที่เชื่อถือได้สำหรับรายการล่าสุดในผลลัพธ์แบบสอบถามคุณต้องมีฟิลด์สำหรับเวลาแทรกและอื่น ๆ BTW โปรดถามคำถามของคุณแยกกันฉันหวังว่าคุณจะได้รับความสนใจมากขึ้น - HTH;)
shA.t

17

คุณไม่สามารถให้order byเพราะorder by "สแกนเต็ม" บนโต๊ะ

แบบสอบถามต่อไปนี้ดีกว่า:

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

18
ORDER BYจะไม่ทำการสแกนแบบเต็มหากคุณคิดว่าidเป็นคีย์หลักของตาราง (และถ้าไม่ใช่ก็เป็นชื่อที่ค่อนข้างแย่) ถ้าไม่คุณคาดหวังว่าMAX(id)จะทำงานโดยไม่ต้องสแกนแบบเต็มตารางได้อย่างไร หากไม่มีดัชนีทุกค่าจะต้องถูกตรวจสอบเพื่อหาค่าสูงสุด
Michael Mior

@CakeLikeBoss ดีจริง ๆ แล้วฉันลอง "เรียงตาม" แบบสอบถามและ "SELECT * จากตาราง WHERE id = (SELECT MAX (id) จากตาราง)"; แบบสอบถามกว่าตารางของ 114 แถวในขณะที่คำนี้เอาตรง 0.0004 วินาทีทุกครั้งในขณะที่แบบสอบถามที่สองเอา 0.0007-0.0010 วินาทีฉันทำซ้ำหลาย ๆ ครั้งนี้
Prabhjot

1

หนึ่งสามารถไปฟังก์ชั่นการวิเคราะห์เช่นกันซึ่งจะช่วยให้คุณควบคุมได้มากขึ้น

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

หากคุณประสบปัญหากับฟังก์ชั่น rank () ขึ้นอยู่กับประเภทของข้อมูลคุณสามารถเลือกจาก row_number () หรือ dense_rank () ได้เช่นกัน


0

ลองกับสิ่งนี้

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

9
คำหลัก TOP ไม่ทำงานใน MySQL แบบสอบถามนี้จะไม่ทำงาน
Anirudha Gupta

@toddmo: MySQL! และ Sql-Server ก็ไม่ได้มีประโยชน์สำหรับคนอื่นเช่นกัน คุณหมายถึง MS-SQL หรือ
raiserle

@raiserle คุณช่วยฉันค้นหาที่ฉันแสดงความคิดเห็นหรือโพสต์สิ่งใดในคำถามนี้ได้หรือไม่ ฉันไม่เห็นชื่อของฉันแนบกับคำถามนี้ทุกที่
toddmo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.