Rightsoft Webboard

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
แท็กยอดนิยม: ภาษาไทย แจก discuz
ดู: 2389|ตอบกลับ: 1

การหาค่า Overlap ของตาราง

[คัดลอกลิงก์]

15

กระทู้

2

เพื่อน

231

เครดิต

ผู้ดูแลบอร์ด

Rank: 7Rank: 7Rank: 7

โพสต์เมื่อ 2014-5-31 00:26:00 |ดูโพสต์ทั้งหมด
มีลูกค้าถามบ่อยเลยว่าเราจะหาช่วงเวลาที่คาบเกี่ยวกันของกิจกรรมแต่ละอันได้อย่างไรบ้าง (ถ้าแค่ 5-6 รายการคงไม่เป็นปัญหามั้ง) เอาเป็นว่า ทางออกของปัญหา Sql ช่วยได้ มาดูตัวอย่างกัน
  ถ้าสมมุติ มีตารางกิจกรรมเป็นแบบนี้


id start_p end_p
A 1 10
B 815
C 1825
D 21 25
E 30 32
F 24 26
G 11 19


การเทียบ 2 ช่วงว่า overlap กันหรือไม่ อยู่ 2 กรณี
คือ คาบเกี่ยวกันบางส่วน เช่น A กับ B
และอีกกรณีคือ ซ้อนเข้าไปข้างใน เช่น C กับ D

เงื่อนไขในการตรวจสอบว่าทับกันหรือไม่จึงเป็น
A.end >= B.start AND (A.end <= B.start OR A.start <= B.end)

ส่วนช่วงที่ทับกันคือ max ของ start และ min ของ end

เขียนเป็น SQL ของ mysql แล้วกันนะครับ
  1. SELECT
  2.         CONCAT(A.id, '-', B.id) AS id2,
  3.     IF(A.start_p > B.start_p, A.start_p, B.start_p) AS start_p,
  4.     IF(A.end_p < B.end_p, A.end_p, B.end_p) AS end_p
  5. FROM
  6.     time_period A, time_period B
  7. WHERE
  8.     A.id < B.id
  9.     AND A.end_p >= B.start_p AND A.start_p <= B.end_p
  10. ORDER BY
  11.     A.id ASC, B.id ASC;
คัดลอกไปที่คลิปบอร์ด
ผลลัพธ์ที่ได้

id2 start_p end_p
A-B 8 10
B-G 11 15
C-D 21 25
C-F 24 25
C-G 18 19
D-F 24 25


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

ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

Archiver|WAP|Rightsoft Corporation Co.,Ltd.

GMT+7, 2017-12-18 10:01 , Processed in 1.086656 second(s), 20 queries .

Powered by Discuz! X2.5 Patch R20121101

© 2001-2012 Comsenz Inc.

ขึ้นไปด้านบน