เชียงรายโฟกัสดอทคอม สังคมออนไลน์ของคนเชียงราย ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
วันที่ 26 เมษายน 2024, 07:12:50
หน้าแรก ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก



  • ข้อมูลหลักเว็บไซต์
  • เชียงรายวันนี้
  • ท่องเที่ยว-โพสรูป
  • ตลาดซื้อขายสินค้า
  • ธุรกิจบริการ
  • บอร์ดกลุ่มชมรม
  • อัพเดทกระทู้ล่าสุด
  • อื่นๆ

ประกาศ !! กรุณาอ่านเพื่อทำความเข้าใจ : https://forums.chiangraifocus.com/index.php?topic=1025412.0

+  เว็บบอร์ด เชียงรายโฟกัสดอทคอม สังคมออนไลน์ของคนเชียงราย
|-+  ศูนย์กลางข้อมูลเชียงราย
| |-+  คุยเรื่องไอที - เทคโนโลยี (ผู้ดูแล: K€nGja1, chiohoh, nuifish, NOtis)
| | |-+  [มุมโปรแกรมเมอร์] MySQL กับการ JOIN แบบเลือกรายการล่าสุด
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
« หน้าที่แล้ว ต่อไป »
หน้า: [1] พิมพ์
ผู้เขียน [มุมโปรแกรมเมอร์] MySQL กับการ JOIN แบบเลือกรายการล่าสุด  (อ่าน 712 ครั้ง)
{Cyberman}
To Be Developer
มัธยม
**
ออฟไลน์ ออฟไลน์

กระทู้: 504


โปรแกรมเมอร์เชียงราย


« เมื่อ: วันที่ 04 กุมภาพันธ์ 2018, 06:41:15 »

MySQL กับการ JOIN กลุ่มข้อมูลแบบใช้รายการเดียว ที่ช่วงเวลาเปิดใช้งานสัมพันธ์กัน

จากกระทู้ Retrieving the last record in each group จะเป็นการ JOIN แบบเลือกรายการล่าสุด เช่นกรณีที่ข้อมูลในตารางหลัก มีการเปลี่ยนแปลงรุ่น เปลี่ยนเวอร์ชั่น แต่ยังคงใช้รหัสเดิม และต้องการแค่ข้อมูลเวอร์ชั่นล่าสุดเรคอร์ดเดียวเท่านั้น

นอกจากนี้ยังมีอีกกรณี นั่นก็คือ เมื่อเราย้อนกลับไปดูข้อมูลที่เคยบันทึกเอาไว้ โดยอ้างอิงรหัสเดียวกัน ที่ปัจจุบันได้เปลี่ยนเวอร์ชั่นไปแล้ว ข้อมูลที่ JOIN มาจะแสดงอย่างไร??? จะรู้ได้อย่างไรว่า  ณ วันที่นั้นๆ ใช้ข้อมูลเรคอร์ดไหน??? (ถ้าเราเก็บไอดี PK ไปเลยจะไม่เจอปัญหานี้ แต่เนื่องจากฟิลด์ Code ดันเป็น Unique ID ซึ่งยึดเป็น PK ไปในตัวก็เลยคิดว่าไม่จำเป็นต้องสร้าง ID ขึ้นมาอีก)

ตัวอย่าง ตารางหลัก ที่มีการเปลี่ยนในแต่ละปี  (tb_category)



ตัวอย่างข้อมูลที่เคยบันทึกไว้ด้วยชื่อหมวดหมู่ในแต่ละช่วงเวลา (tb_product)
กรรไกรตัดกิ่ง   ณ วันที่ 2017-06-01    ได้ทำรายการด้วยชื่อ  "วัสดุทำสวน"
กรรไกรเล็ก      ณ วันที่ 2018-01-31   ได้ทำรายการด้วยชื่อ  "วัสดุอุปกรณ์ทำสวน"



เราลองมาดูข้อมูลเมื่อ JOIN กับตารางหมวดหมู่ ว่าผลลัพธ์จะออกมาเป็นเช่นไร


จะเห็นว่าได้ข้อมูลมาหลายเรคอร์ด และเรคอร์ดที่ตรงกับข้อมูลที่เคยทำรายการจริง
ก็คือแถวที่ 3 และ แถวที่ 6 ที่ลูกศรสีแดงชี้


เพื่อให้เห็นภาพที่ชัดขึ้น เราจะทำการ GROUP รหัสสินค้า เพื่อลดจำนวนเรคอร์ดที่ซ้ำซ้อนออกไป


ผลปรากฏว่า ชื่อหมวดหมู่ที่แสดงไม่ถูกต้อง เมื่อสังเกตวันที่ start_used_date จะเห็นว่า ได้ดึงแค่เรคอร์ดแรกมาเท่านั้น ไม่ได้ดึงตามช่วงเวลาของข้อมูลจริง


วิธีแก้ไขก็คือ เราต้องเพิ่มเงื่อนไขวันที่ เข้าไปในการ JOIN
โดยกำหนด Sub Query ให้เลือกเฉพาะรายการที่เปิดใช้งานก่อนนำไปใช้งานในครั้งนั้นๆ


เมื่อเราเพิ่มเงื่อนไข start_used_date <= product.active_date
เข้าไปใน Sub Query ก็จะได้ ID ของเรคอร์ดที่เปิดใช้งาน
ในช่วง active_date ของรายการนั้นๆ ซึ่งตรงกับที่เกิดขึ้นจริง


หากเห็นว่าเป็นประโยชน์ หรือมีกรณีใกล้เคียงกัน ก็ลองเอาไปปรับใช้กันดูนะครับ

ที่มา : http://phpcodemania.blogspot.com/2018/01/mysql-join-group-record.html

« แก้ไขครั้งสุดท้าย: วันที่ 28 มีนาคม 2018, 22:51:37 โดย {Cyberman} » IP : บันทึกการเข้า

หน้า: [1] พิมพ์ 
« หน้าที่แล้ว ต่อไป »
กระโดดไป:  


เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

 
เรื่องที่น่าสนใจ
 

ข้อความที่ท่านได้อ่านบนกระดานข่าวแห่งนี้ เกิดขึ้นจากการเขียนโดยสาธารณชน และตีพิมพ์แบบอัตโนมัติ ผู้ดูแลเว็บไซต์แห่งนี้ไม่จำเป็นต้องเห็นด้วย
และไม่รับผิดชอบต่อข้อความใดๆ ผู้อ่านจึงต้องใช้วิจารณญาณในการกลั่นกรองด้วยตัวเอง และถ้าท่านพบเห็นข้อความใดๆ ที่ขัดต่อกฎหมาย และศีลธรรม พาดพิง ละเมิดสิทธิบุคคอื่น ต้องการแจ้งลบ
กรุณาส่งลิงค์มาที่
เพื่อทีมงานจะได้ดำเนินการลบออกให้ทันที..."

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines
www.chiangraifocus.com

Valid XHTML 1.0! Valid CSS!