ความสัมพันธ์เชิงลำดับชั้นของข้อมูลใน PHP
สมมติว่าเรามีโจทย์ที่ต้องเก็บข้อมูลเกี่ยวกับพ่อ และลูกชาย สมมติว่าพ่อแต่ละคนสามารถมี ลูกชายได้เพียงคนเดียว และลูกชายก็สามารถ มีลูกชายได้หนึ่งคนเช่นกัน
เราต้องคิดว่าจะจัดเก็บข้อมูลอย่างไร
แนวคิดแรกที่น่าจะนึกถึง
- คือสร้างสองตาราง: parents สำหรับ
พ่อ และ sons สำหรับลูกชาย จากนั้นเชื่อมโยง
ตารางเหล่านี้ด้วยฟิลด์บางอย่าง: son_id
หรือ parent_id
อย่างไรก็ตาม นี่ไม่ใช่แนวคิดที่ดีนัก - เพราะ บุคคลเดียวกันอาจเป็นได้ทั้ง พ่อและลูกชาย - และเราจะต้องเก็บข้อมูลของเขา ในทั้งสองตาราง ซึ่งนี่ไม่สะดวก ใช้พื้นที่ มากกว่า และอาจนำไปสู่ข้อผิดพลาดได้ง่าย
ตัวเลือกที่ดีกว่าคือการเชื่อมโยงตารางกับ
ตัวมันเอง: สร้างตาราง users ใน
นั้นเราจะเก็บข้อมูลผู้ใช้ทั้งหมด และสำหรับแต่ละคนจะสร้าง
ฟิลด์ son_id ซึ่งจะเก็บ
id ของลูกชายจากตารางเดียวกันนี้:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
แบบสอบถาม (Queries)
ตอนนี้เรามาเขียนคำสั่งเพื่อดึงข้อมูล ผู้ใช้พร้อมกับลูกชายของเขากัน
เริ่มต้นด้วยการดึงข้อมูลผู้ใช้:
SELECT
*
FROM
users
ตอนนี้เรา join ข้อมูลลูกชายเข้ากับผู้ใช้ เรา จะ join ตารางกับตัวมันเอง ดังนั้นเราจึง ต้องทำการเปลี่ยนชื่อตาราง:
LEFT JOIN users as sons
ตอนนี้เราสามารถระบุความสัมพันธ์ระหว่างตารางหลัก และตารางที่เปลี่ยนชื่อแล้วได้:
LEFT JOIN users as sons ON sons.id=users.son_id
ต่อไปเราจะระบุฟิลด์ที่ต้องการ:
SELECT
users.name as user_name, sons.name as son_name
นำทุกส่วนมารวมกันและเราจะได้คำสั่งดังต่อไปนี้:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
โจทย์ฝึกปฏิบัติ
สมมติว่าเรามีหมวดหมู่ แต่ละหมวดหมู่ สามารถอยู่ภายใต้หมวดหมู่แม่ได้ และหมวดหมู่แม่นั้นก็มีหมวดหมู่แม่ของตัวเองได้อีก และเป็นเช่นนี้เรื่อยไป อธิบายโครงสร้างการจัดเก็บ
เขียนคำสั่งเพื่อดึงข้อมูลหมวดหมู่ พร้อมกับหมวดหมู่แม่ของมัน
เขียนคำสั่งเพื่อดึงข้อมูลหมวดหมู่ พร้อมกับหมวดหมู่แม่และหมวดหมู่ยาย (ระดับถัดไป) ของมัน
เขียนคำสั่งเพื่อดึงข้อมูลหมวดหมู่ พร้อมกับหมวดหมู่แม่ หมวดหมู่ยาย และหมวดหมู่ทวด