เนื้อหาต่อไปนี้ เป็นแนวทางในการแสดงข้อมูลที่ได้จากการใช้งานการจัดกลุ่มข้อมูลด้วย GROUP BY
โดยจะขอใช้ตัวอย่างฐานข้อมูลสำหรับทดสอบตามลิ้งค์ด้านล่าง
กรณีต้องการทดสอบไปพร้อมกับ บทความ ให้นำคำสั่ง sql จากลิ้งค์ด้านบนไปคิวรี่ในฐานข้อมูล
เพื่อเพิ่มตาราง และข้อมูลตัวอย่าง ซึ่งมีทั้งหมด 77 รายการ ตามตัวอย่างข้อมูลด้านล่าง บางส่วน
ตารางข้างต้น เป็นตารางชื่อ tbl_provinces โดยฟิลด์คอมลัมน์ที่จะใช้งานหรืออ้างอิงในที่นี้คือ
geo_id หรือเข้าใจอย่างง่ายก็คือ id ของภาคหรือภูมิภาค ของจังหวัดนั้นๆ เช่น ภาคกลาง ก็จะแทน
ด้วยเลข 2 เป็นต้น
ส่วนฟิลด์คอลัมน์ last_update จะเป็นวันที่อัพเดทล่าสุด ในที่นี้จะเป็นข้อมูลทดสอบ และทุกจังหวัด
จะมีวันทีและเวลาของ last_update เหมือนกันคือ 2018-09-19 12:11:03 โดยเกี่ยวกับเงื่อนไขเวลานั้น
เราจะอธิบายในอีกส่วน ตามลำดับ
การใช้ GROUP BY เพื่อจัดกลุ่มรายการข้อมูล ใน SQL
เริ่มต้นเราจะใช้งาน GROUP BY อย่างง่ายด้วยคำสั่ง ดังนี้
SELECT * FROM tbl_provinces GROUP BY geo_id
ผลลัพธ์ที่ได้ คือ
สังเกตว่าข้อมูล จากทั้งหมด 77 รายการ แสดงเหลือแค่ 6 รายการตามเงื่อนไข กลุ่มข้อมูล ที่เรากำหนด
ใน GROUP BY ซึ่งก็คือ geo_id นั้นหมายความว่า ในตารางมี geo_id ที่ไม่ซ้ำกันทั้งหมด 6 รายการ
และโดยปกติ การแสดง จะเรียงจาก น้อยไปมาหรือ ASC จาก ฟิดล์ที่เราจัดกลุ่ม จะเห็นได้จาก รายการ
มีการแสดง geo_id จาก 1 ถึง 6 เราสามารถกำหนดการจัดกลุ่ม พร้อมเรียงข้อมูลจากฟิลด์นั้น โดยการ
เพิ่มเงื่อนไขการจัดเรียง กรณีเป็น มากไปน้อยหรือ DESC ได้ดังนี้
SELECT * FROM tbl_provinces GROUP BY geo_id DESC
ผลที่ได้ จะได้เป็น
ในที่นี้เราจะไม่กำหนด DESC
การเรียงข้อมูลจาก primary key ของรายการที่จัดการด้วย GROUP BY
สังเกตตารางข้อมูล ที่เราจัดกลุ่มด้วยคำสั่ง ในตอนต้น
SELECT * FROM tbl_provinces GROUP BY geo_id
จะเห็นว่า เนื่องจาก province_id ของเราเป็น primary key ในแต่ละ geo_id จะมีจังหวัดที่มี
ค่า primary key ที่น้อยสุดแสดงเสมอ อย่างเช่น กรุงแทพ ที่มีค่า province_id เท่ากับ 1
หรือก็คือจังหวัดที่เป็นลำดับแรกๆ ของแต่ละภูมิภาค ถูกนำมาแสดง เมื่อมีการใช้งาน GROUP BY
สิ่งที่เราค้องการ ในกรณีเงื่อนไขแรกนี้ คือ เราต้องการแสดง รายการสุดท้ายหรือจังหวัดสุดท้าย
ของแต่ละภูมิภาคแทน โดยสามารถใช้คำสั่งดังนี้
SELECT * FROM (SELECT MAX(province_id) as province_id,geo_id FROM tbl_provinces GROUP BY geo_id) a LEFT JOIN (SELECT * FROM tbl_provinces) b ON a.province_id=b.province_id
แนวทางคือ การใช้ LEFT JOIN กับการคิวรี่ข้อมูล 2 ครั้ง เหมือนกับการสร้างตางรางชั่วคราว จากการคิวรี่
อีกที อย่างคำสั่งคิวรี่แรก
SELECT MAX(province_id) as province_id,geo_id FROM tbl_provinces GROUP BY geo_id
แสดง province_id ที่มีค่ามากที่สุดของของกลุ่มรายการที่จัดกลุ่มด้วย geo_id แล้วแทนตัวยชื่อตารางสมมติ
ว่า a
สังเกตผลที่ได้ คร่าวๆ เราจะเห็นว่ามี province_id เท่ากับ 77 หรือก็คือจังหวัดลำดับที่ 77 ซึ่งเป็นลำดับสุด
ท้าย และเป็นจังหวัดที่อยู่ลำดับสุดท้ายของ กลุ่ม geo_id เท่ากับ 3 ในที่นี้เราพอเดาได้ว่าเป็นจังหวัดบืงกาฬ
ทีนี้พอเราเอาไป LEFT JOIN กับ คิวรี่ที่ 2
SELECT * FROM tbl_provinces
ซึ่งเป็นจังหวัดทั้งหมด โดยมีเงื่อนไขการ LEFT JOIN คือ เช็ค province_id ที่มีค่ามากสุด ว่าเป็นของ
จังหวัดอะไร ด้วยเงื่อนไข
ON a.province_id=b.province_id
ก็ได้ผลลัพธ์ดังนี้
จะเห็นว่ารายการจังหวัดของแต่ละกลุ่มนั้น กลายเป็นจังหวัดสุดท้าย หรือจังหวัดที่มีค่า province_id
มากสุดของแต่ละกลุ่มมาแสดง ซึ่งวิธีการนี้เหมาะสำหรับ ต้องการเรียงข้อมูลจาก primary key
การเรียงข้อมูลจากการอัพเดทล่าสุด หรือรายการที่ไม่ใช่ primary key
สำหรับเงื่อนไขที่สองนี้ เราจะใช้กรณีว่า เราต้องการแสดงเฉพาะรายการที่อัพเดทล่าสุดจากวันที่
เวลาที่อัพเดทล่าสุด เราสามารถใช้รูปแบบคำสั่งได้ดังนี้
SELECT * FROM (SELECT MAX(last_update) as last_update,geo_id FROM tbl_provinces GROUP BY geo_id ) a LEFT JOIN (SELECT * FROM tbl_provinces) b ON a.last_update=b.last_update AND a.geo_id=b.geo_id GROUP BY b.geo_id
จะเห็นว่ารูปแบบคำสั่งจะคล้ายๆ เดิม แต่เปลี่ยนเป็นฟิลด์ ที่เราต้องการ ในที่นี้เราใช้ last_update
และเพิ่มการจัดกลุ่มให้กับรายการที่ทำการ LEFT JOIN ด้วย GROUP BY อีกครั้ง
ผลลัพธ์ที่ได้จะเป็นดังนี้
จากผลลัพธ์ข้างต้น เราอาจจะไม่เห็นการเปลี่ยนแปลง เพราะว่าข้อมูลตัวอย่างของเรา ใช้วันที่และเวลา
เดียวกับหมดทุกรายการ ให้เราทดสอบเปลี่ยนวันที่ของจังหวัดกรุงเทพ และวันที่ของจังหวัดบืงกาฬ
เป็น 2018-09-20 12:11:03 และ 2018-09-21 12:11:03 แล้วทดสอบเรียกใช้คำสั่งใหม่อีกครั้ง
จะได้ผลลัพธ์ดังนี้
สังเกตว่า รอบนี้ รายการที่ 2 กับ 3 เปลี่ยนเป็นรายการที่มีเวลาอัพเดทล่าสุดมาแสดงแทน
หวังว่าแนวทางข้างต้น จะสามารถนำไปประยุกต์เพิ่มเติม หรือปรับให้เหมาะสมกับการใช้งานต่อไปได้