เลือก N แถวสุดท้ายจาก MySQL


122

ฉันต้องการที่จะเลือกช่วง 50 แถวจากฐานข้อมูล MySQL ภายในคอลัมน์ชื่อIDซึ่งเป็นคีย์หลัก เป้าหมายคือแถวควรเรียงตามidในลำดับASCนั่นคือสาเหตุที่การสืบค้นนี้ไม่ทำงาน

SELECT 
    *
FROM
    `table`
ORDER BY id DESC
LIMIT 50;

นอกจากนี้ยังน่าทึ่งที่สามารถจัดการแถว (ลบ) ได้และนั่นเป็นสาเหตุที่แบบสอบถามต่อไปนี้ไม่ทำงานเช่นกัน

SELECT 
    *
FROM
    `table`
WHERE
    id > ((SELECT 
            MAX(id)
        FROM
            chat) - 50)
ORDER BY id ASC;

คำถาม : จะดึง N แถวสุดท้ายจากฐานข้อมูล MySQL ที่สามารถจัดการและอยู่ในลำดับ ASC ได้อย่างไร?

คำตอบ:


237

คุณสามารถทำได้ด้วยแบบสอบถามย่อย:

SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC

นี่จะเป็นการเลือก50 แถวสุดท้ายจากtableนั้นเรียงลำดับจากน้อยไปหามาก


5
^ FYI ฉันรู้ว่าบทความนี้เกี่ยวกับ MySQL แต่ต้องการแนะนำว่าในการตอบสนองต่อความคิดเห็นของ @ DiegoDD ด้านบนการละเว้นการเลือกภายนอกและนามแฝงดูเหมือนจะไม่ทำงานใน Postgres (9.3.5) ฉันได้รับ 'ข้อผิดพลาด: ไม่อนุญาตให้ใช้คำสั่ง ORDER BY หลายรายการ' อย่างไรก็ตามคำตอบที่ยอมรับได้ทำงานตามที่คาดไว้ใน Postgres
allenwlee

ขอบคุณสำหรับสิ่งนี้! คำค้นหานี้ช่วยฉันแก้ไขปัญหาของฉันได้ ฉันค้นหาสิ่งนี้มาหลายชั่วโมงแล้ว
Arshad

1
ฉันจะใช้แบบสอบถามนี้กับ JOINS ได้อย่างไร?
GYaN

@GYaN เพิ่มการเชื่อมต่อในแบบสอบถามย่อยด้านใน
Sheikh hamza

9
SELECT * FROM table ORDER BY id DESC,datechat desc LIMIT 50

หากคุณมีฟิลด์วันที่ที่จัดเก็บวันที่ (และเวลา) ที่แชทถูกส่งหรือฟิลด์ใด ๆ ที่เต็มไปด้วยข้อมูลที่เพิ่มขึ้น (เรียงตาม DESC) หรือ desinscrementally (เรียงตาม ASC) ต่อแถวให้วางเป็นคอลัมน์ที่สอง ซึ่งข้อมูลควรเป็นลำดับ

นั่นคือสิ่งที่ได้ผลสำหรับฉัน !!!! หวังว่าจะช่วยได้ !!!!


7
SELECT * FROM table ORDER BY id DESC LIMIT 50

ประหยัดทรัพยากรสร้างแบบสอบถามเดียวไม่จำเป็นต้องสร้างแบบสอบถามที่ซ้อนกัน


1
ข้อความค้นหาของคุณจะแสดงผลลัพธ์ในแบบย้อนกลับ (รหัสจากมากไปหาน้อย) ข้อความค้นหาของ @ newfurniturey จะได้รับแถวที่แทรก LAST ( LIMITอยู่ที่ id จากมากไปหาน้อย) และผลลัพธ์สุดท้ายจะมีรหัสจากน้อยไปมาก
Robin Kanters

1
วิธีการแก้ปัญหาของคุณจะไม่ได้ผลลัพธ์ตามลำดับที่ถูกต้อง แต่จะทำให้พวกเขากลับกันดังนั้นจึงจำเป็นต้องมีคำสั่งอื่นเพื่อให้ได้ลำดับที่ถูกต้องอีกครั้ง
Cobra47

1
แต่แล้วคุณก็ทำ php array_reverse () หรืออะไรก็ได้ที่เทียบเท่าในภาษาสคริปต์ที่คุณเลือก ฐานข้อมูลไม่จำเป็นต้องทำงานนั้น
โจ

6
@ โจไม่มีสิ่งใดในคำถามที่บ่งชี้ว่ามีการใช้ภาษาสคริปต์ดังนั้นจึงไม่ใช่ข้อสันนิษฐานที่ปลอดภัยที่จะทำ
Nick Coons

คำตอบที่คาดไว้ควรเรียงลำดับแล้วโดยใช้แบบสอบถามฐานข้อมูลเท่านั้น
d4ryl3

-2
select * from Table ORDER BY id LIMIT 30

หมายเหตุ: * idควรไม่ซ้ำกัน * คุณสามารถควบคุมจำนวนแถวที่ส่งคืนได้โดยแทนที่30ในแบบสอบถาม


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