Data Engineering

เชื่อมตารางตัวเองใน MySQL ด้วย SELF JOIN

การ JOIN ตารางใน MySQL ปกติจะเป็นการเชื่อมกับตารางอื่น แต่คุณรู้หรือไม่ว่าสามารถเชื่อมกับตารางตัวเองก็ได้นะ สามารถนำไปประยุกต์ใช้ได้หลายอย่างเช่น ใช้กับข้อมูลที่มีลำดับชั้น ตรวจสอบความเปลี่ยนแปลงในตารางเดียวกัน

การเชื่อมโยงระหว่างตารางเป็นเรื่องปกติสำหรับ MySQL แต่คุณรู้หรือไม่ว่า มันสามารถเชื่อมตารางตัวเองก็ได้นะ (Self JOIN) โดยการใช้ INNER JOIN หรือ LEFT JOIN

SELF JOIN คืออะไร ?

SELF JOIN เป็นการเชื่อมตาราง (join) ตัวมันเอง แทนที่จะเชื่อมกับตารางอื่น การจะใช้ SELF JOIN ได้นั้นจำเป็นต้องใช้ table aliases หรือการตั้งชื่อให้กับตาราง ซึ่งเราจะตั้งชื่อคนละชื่อกัน ถ้าเป็นชื่อเดียวกันจะเกิด error

ทำไมต้องใช้ SELF JOIN และมันใช้ยังไง ?

ใช้กับข้อมูลที่มีลำดับชั้น (Hierarchical Data)

เมื่อมีการเก็บข้อมูลที่เป็นลำดับชั้น เช่น organizational chart, category ในรูปแบบ tree, ข้อมูลบทสนทนา คุณสามารถใช้ Self JOIN ได้ ยกตัวอย่างเช่น ต้องการแสดงรายชื่อพนักงานและผู้จัดการของพนักงานคนนั้น ในตาราง employees

SELECT e1.employee_name AS employee, e2.employee_name AS manager
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.employee_id

เพื่อตรวจสอบความเปลี่ยนแปลง (Tracking Changes)

ถ้าคุณมีตาราง audit_log ที่ใช้สำหรับดูการเปลี่ยนแปลง คุณสามารถใช้ SELF JOIN ในการเปรียบเทียบระหว่างเวอร์ชันปัจจุบันกับ กับเวอร์ชันก่อนหน้านี้ได้ เช่น

SELECT current.*, previous.*
FROM audit_log current
LEFT JOIN audit_log previous
ON current.record_id = previous.record_id AND current.timestamp > previous.timestamp

อธิบาย Query

  • ใช้ LEFT JOIN ในการเชื่อม เนื่องจากอาจไม่มีข้อมูลเวอร์ชันก่อนหน้านี้
  • เงื่อนไขในการเชื่อมไม่จำเป็นต้องเป็นการเท่ากับเสมอไป สามารถใช้การเปรียบเทียบทางคณิตศาสตร์แบบอื่นก็ได้ เช่น น้อยกว่า มากกว่า

หาข้อมูลที่มีความสัมพันธ์กัน

เพื่อให้เกิดความเข้ามากขึ้นในการหาข้อมูลที่มีความสัมพันธ์ในตารางเดียวกัน ขอยกตัวอย่างการเชื่อมตารางลูกค้า (customers) ที่มีที่อยู่เดียวกัน คุณสามารถใช้ SELF JOIN ได้ โดยดูจาก SQL นี้

SELECT c1.customer_name AS customer1, c2.customer_name AS customer2, c1.address
FROM customers c1
JOIN customers c2 ON c1.address = c2.address AND c1.customer_id <> c2.customer_id

อธิบาย Query

  • การใช้เงื่อนไขในการ JOIN ว่า c1.customer_id <> c2.customer_id เป็นการบอกว่าต้องไม่ใช่ customer_id เดียวกัน

ลองนำวิธีนี้ไปประยุกต์ใช้กันดูนะครับ ขอบคุณที่ติดตามครับ

ขอบคุณข้อมูลดีๆจาก : mysqltutorial.org , javatpoint.com

Tags