คำสั่ง ORDER BY ไม่เรียงลำดับผลลัพท์เมื่ออยู่ใน SUBQUERY
เรื่องของเรื่องคือผมพบปัญหาของคำสั่ง SQL ไม่เรียงลำดับผลลัพท์ตามที่ต้องการ หลังจากที่ผมอัปเกรด Server
ลองพิจารณาคำสั่ง SQL ด้านบนดูนะครับ จะเห็นว่าคำสั่งก็ดูปกติ ซึ่งจากการทดสอบบนเครื่องของผม (localhost) ก็ปกติดีทุกประการครับ แต่พอเอาโค้ดขึ้น Server จริงๆเท่านั้นละ ปัญหาเกิดเลย เนื่องจากบน Server จริงผลลัพท์กลับไม่เรียงลำดับตามที่ต้องการ
เรื่องนี้ไม่ใช่ข้อผิดพลาดของคำสั่ง แต่เป็นข้อกำหนดมาตรฐานของ SQL เองครับ โดยที่ตามมาตรฐานของ SQL ได้ระบุไว้ว่า เราจะไม่สามารถเรียงลำดับข้อมูลในคิวรี่ย่อย (SUBQUERY) ได้ แต่ใน MySQL เวอร์ชั่นก่อนหน้าก็นอกมาตรฐานนิดหน่อย ที่ยอมให้มันทำงานได้ แต่บน MariaDB กลับปฏิบัติตามมาตรฐานซะงั้น
จริงๆแล้วสิ่งที่ SQL กำหนดไว้ก็เพื่อประสิทธิภาพของคำสั่ง SQL เอง โดยกำหนดให้สามารถใช้ ORDER BY กับ Query ชั้นนอกสุดได้เท่านั้น
แต่ก็มีข้อยกเว้นสำหรับคิวรี่ย่อยที่มีคำสั่ง LIMIT ประกอบอยู่ด้วย จะสามารถใช้งานคำสั่ง ORDER BY ได้
มีทิปที่น่าสนใจอยู่อันหนึ่ง เป็นการกำหนดค่า limit ไปที่ค่าสูงสุดไปเลย ก็จะทำให้คำสั่งข้างต้นสามารถเรียงลำดับได้
หมายเหตุ ผมไม่แน่ใจว่าเวอร์ชั่นใดบ้างของ MySQL ที่สามารถใช้งานได้หรือไม่สามารถใช้งานได้นะครับ แต่จากการทดสอบด้วยตัวผมเอง MySQL 5.7.19 สามารถใช้งานได้ แต่ MariaDB 10.1.26 ไม่สามารถใช้งานได้
SELECT Q.* FROM (
SELECT *
FROM `table_name`
ORDER BY `id` DESC
) AS Q
ลองพิจารณาคำสั่ง SQL ด้านบนดูนะครับ จะเห็นว่าคำสั่งก็ดูปกติ ซึ่งจากการทดสอบบนเครื่องของผม (localhost) ก็ปกติดีทุกประการครับ แต่พอเอาโค้ดขึ้น Server จริงๆเท่านั้นละ ปัญหาเกิดเลย เนื่องจากบน Server จริงผลลัพท์กลับไม่เรียงลำดับตามที่ต้องการ
เรื่องนี้ไม่ใช่ข้อผิดพลาดของคำสั่ง แต่เป็นข้อกำหนดมาตรฐานของ SQL เองครับ โดยที่ตามมาตรฐานของ SQL ได้ระบุไว้ว่า เราจะไม่สามารถเรียงลำดับข้อมูลในคิวรี่ย่อย (SUBQUERY) ได้ แต่ใน MySQL เวอร์ชั่นก่อนหน้าก็นอกมาตรฐานนิดหน่อย ที่ยอมให้มันทำงานได้ แต่บน MariaDB กลับปฏิบัติตามมาตรฐานซะงั้น
จริงๆแล้วสิ่งที่ SQL กำหนดไว้ก็เพื่อประสิทธิภาพของคำสั่ง SQL เอง โดยกำหนดให้สามารถใช้ ORDER BY กับ Query ชั้นนอกสุดได้เท่านั้น
SELECT Q.* FROM (
SELECT *
FROM `table_name`
) AS Q
ORDER BY `id` DESC
แต่ก็มีข้อยกเว้นสำหรับคิวรี่ย่อยที่มีคำสั่ง LIMIT ประกอบอยู่ด้วย จะสามารถใช้งานคำสั่ง ORDER BY ได้
SELECT Q.* FROM (
SELECT *
FROM `table_name`
ORDER BY `id` DESC
LIMIT 10
) AS Q
มีทิปที่น่าสนใจอยู่อันหนึ่ง เป็นการกำหนดค่า limit ไปที่ค่าสูงสุดไปเลย ก็จะทำให้คำสั่งข้างต้นสามารถเรียงลำดับได้
SELECT Q.* FROM (
SELECT *
FROM `table_name`
ORDER BY `id` DESC
LIMIT 4294967295
) AS Q
หมายเหตุ ผมไม่แน่ใจว่าเวอร์ชั่นใดบ้างของ MySQL ที่สามารถใช้งานได้หรือไม่สามารถใช้งานได้นะครับ แต่จากการทดสอบด้วยตัวผมเอง MySQL 5.7.19 สามารถใช้งานได้ แต่ MariaDB 10.1.26 ไม่สามารถใช้งานได้