ฉันจะทำสิ่งนี้ได้อย่างไร
แถว 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