แสดงข้อมูลล่าสุดหรือค่าสูงสุด ในรายการจัดกลุ่มข้อมูล GROUP BY

เขียนเมื่อ 5 ปีก่อน โดย Ninenik Narkdee
group by max.เรียงจากล่าสุด

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ group by max.เรียงจากล่าสุด

ดูแล้ว 32,742 ครั้ง


เนื้อหาต่อไปนี้ เป็นแนวทางในการแสดงข้อมูลที่ได้จากการใช้งานการจัดกลุ่มข้อมูลด้วย 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 เปลี่ยนเป็นรายการที่มีเวลาอัพเดทล่าสุดมาแสดงแทน
 
หวังว่าแนวทางข้างต้น จะสามารถนำไปประยุกต์เพิ่มเติม หรือปรับให้เหมาะสมกับการใช้งานต่อไปได้


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ











URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ