PHP Ionic Angular HTML5 AJAX Javascript CSS MySQL jQuery Forum


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

19 September 2018 By Ninenik Narkdee
group by max.เรียงจากล่าสุด

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



เนื้อหาต่อไปนี้ เป็นแนวทางในการแสดงข้อมูลที่ได้จากการใช้งานการจัดกลุ่มข้อมูลด้วย GROUP BY
โดยจะขอใช้ตัวอย่างฐานข้อมูลสำหรับทดสอบตามลิ้งค์ด้านล่าง
 
https://www.ninenik.com/forum_view_2398_1.html#comment_6277
 
กรณีต้องการทดสอบไปพร้อมกับ บทความ ให้นำคำสั่ง 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 เปลี่ยนเป็นรายการที่มีเวลาอัพเดทล่าสุดมาแสดงแทน
 
หวังว่าแนวทางข้างต้น จะสามารถนำไปประยุกต์เพิ่มเติม หรือปรับให้เหมาะสมกับการใช้งานต่อไปได้






Tags:: max.เรียงจากล่าสุด group by






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


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