SQL - เลือกเฉพาะที่มีค่ามากที่สุด

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

คำสั่ง SQL มีคำสั่งที่พอจะประยุกต์ใช้กับงานลักษณะนี้ได้โดยมีฟังก์ชั่น max() , min() และนิพจน์ "GROUP BY" เป็นตัวช่วยให้ได้ผลลัพธ์ออกมาเฉพาะรายการที่มีค่ามากที่สุด / น้อยที่สุก ซึ่งอาจประยุกต์ไปใช้กับการหาข้อมูลที่ปรับปรุงใหม่ที่สุด / เก่าที่สุดก็ได้ตามใจเรา

SELECT `id`, max(`status_value`) as [keyfield] FROM [table] GROUP BY `id`; ...(1)

นอกจากนี้ด้วยนิพจน์ "INNER JOIN" จะทำให้เราประยุกต์เอารายการที่หาได้จาก ...(1) มาใช้เป็นเงื่อนไขที่จะกรองเอาเฉพาะ Record ใหม่สุด / เก่าสุด ที่ต้องการได้ทันทีครับ เพราะการ JOIN แบบ INNER นั้นหาก SELECT แล้วไม่ได้ข้อมูลมา Record นั้นจะโดนดึงออกจากรายการผลลัพธ์นั่นเอง

SELECT a.* FROM [table] a INNER JOIN (
    SELECT `id`, max(`status_value`) as [keyfield] FROM [table] GROUP BY `id`;
) b on a.id = b.id and a.status_value = b.keyfield;

หวังว่าคงเป็นแนวทางในการประยุกต์ใช้กับงานของเพื่อนๆได้ไม่มากก็น้อยนะครับ
เจอกันใหม่ตอนหน้าครับ สวัสดีครับ


ปล.
***
เขียนจบก็นึกขึ้นได้ เราสามารถใช้คำสั่ง IN เพื่อเชื่อมเงื่อนไขเข้ากับ Cursor ที่ได้จากคำสั่ง SELECT อื่นๆได้เหมือนกันนะครับ ดังนี้

SELECT * FROM [table] WHERE (`id`,`rev`) IN (
     SELECT `id`, max(`status_value`) FROM [table] GROUP BY `id`
);

อ่ะ จบจริงๆแล้ว....บายครับ

แสดงความคิดเห็น

0 ความคิดเห็น