ฉันจะทำสิ่งนี้ได้อย่างไร
แถว SQL SELECT จากตาราง WHERE id = max (id)
ฉันจะทำสิ่งนี้ได้อย่างไร
แถว SQL SELECT จากตาราง WHERE id = max (id)
คำตอบ:
คุณสามารถใช้การเลือกย่อย:
SELECT row
FROM table
WHERE id=(
SELECT max(id) FROM table
)
โปรดทราบว่าถ้าค่าของmax(id)ไม่ซ้ำกันหลายแถวจะถูกส่งกลับ
หากคุณต้องการเพียงแถวเดียวให้ใช้คำตอบของ @ MichaelMior
SELECT row from table ORDER BY id DESC LIMIT 1
idเป็นเพียงคอลัมน์ในตาราง ไม่รับประกันว่าค่าในidคอลัมน์จะต้องไม่ซ้ำกัน
idไม่ใช่คีย์หลักหรือรหัสเฉพาะ :) ด้วยชื่อมีโอกาสที่สมเหตุสมผล นอกจากนี้ยังเป็นที่น่าสังเกตว่าขึ้นอยู่กับ DBMS ที่คุณใช้วิธีการเลือกย่อยอาจมีประสิทธิภาพน้อยกว่ามาก
idอาจเป็นคีย์ต่างประเทศซึ่งในกรณีนี้อาจไม่ซ้ำกัน ฉันใช้การเปรียบเทียบset profiling = 1; ...; show profilesและปรากฏว่าโซลูชันของเรามีประสิทธิภาพการทำงานที่เหมือนกันโดยใช้ MySQL สำหรับความรู้ของฉันเองคุณรู้หรือไม่ว่า DBMS มีประสิทธิภาพที่ต่ำกว่าสำหรับการเลือกย่อยหรือไม่
คุณสามารถทำได้
SELECT row FROM table ORDER BY id DESC LIMIT 1;
นี่จะเรียงลำดับแถวตาม ID ของพวกเขาในลำดับถัดลงมาและกลับไปแถวแรก นี่เหมือนกับการส่งคืนแถวด้วย ID สูงสุด แน่นอนนี้ถือว่าidเป็นสิ่งที่ไม่ซ้ำกันในทุกแถว มิฉะนั้นอาจมีหลายแถวที่มีค่าสูงสุดidและคุณจะได้รับเพียงแถวเดียว
SELECT *
FROM table
WHERE id = (SELECT MAX(id) FROM TABLE)
SELECT entry FROM table WHERE id = MAX(id)งานไม่ได้!
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
คุณไม่สามารถให้order byเพราะorder by "สแกนเต็ม" บนโต๊ะ
แบบสอบถามต่อไปนี้ดีกว่า:
SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);
ORDER BYจะไม่ทำการสแกนแบบเต็มหากคุณคิดว่าidเป็นคีย์หลักของตาราง (และถ้าไม่ใช่ก็เป็นชื่อที่ค่อนข้างแย่) ถ้าไม่คุณคาดหวังว่าMAX(id)จะทำงานโดยไม่ต้องสแกนแบบเต็มตารางได้อย่างไร หากไม่มีดัชนีทุกค่าจะต้องถูกตรวจสอบเพื่อหาค่าสูงสุด
หนึ่งสามารถไปฟังก์ชั่นการวิเคราะห์เช่นกันซึ่งจะช่วยให้คุณควบคุมได้มากขึ้น
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 () ได้เช่นกัน
ลองกับสิ่งนี้
SELECT top 1 id, Col2, row_number() over (order by id desc) FROM Table