Mối quan hệ dữ liệu cha con trong PHP
Giả sử chúng ta có nhiệm vụ lưu trữ thông tin về các người cha và con trai. Giả định mỗi người cha chỉ có thể có một con trai, và người con trai đó cũng chỉ có thể có một con trai.
Chúng ta cần nghĩ cách lưu trữ dữ liệu.
Ý tưởng đầu tiên có thể nảy ra là
tạo hai bảng: parents cho
các người cha và sons cho các con trai. Sau đó liên kết
các bảng này bằng một trường nào đó: son_id
hoặc parent_id.
Tuy nhiên, đây không phải là ý tưởng hay - bởi vì một người có thể đồng thời vừa là cha vừa là con - và sẽ phải lưu trữ thông tin của người đó trong cả hai bảng, điều này gây bất tiện, tốn nhiều dung lượng hơn và dễ dẫn đến lỗi.
Một phương án tốt hơn là liên kết bảng với chính nó:
tạo bảng users, trong đó
lưu trữ tất cả người dùng và tạo cho mỗi người một
trường son_id, trong đó lưu trữ
id của người con trai từ chính bảng đó:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Các truy vấn
Bây giờ hãy viết một truy vấn để lấy thông tin người dùng cùng với con trai của họ.
Đầu tiên, hãy lấy thông tin người dùng:
SELECT
*
FROM
users
Bây giờ hãy thực hiện JOIN với các con trai của họ. Chúng ta sẽ JOIN bảng với chính nó, vì vậy cần thực hiện đổi tên bảng:
LEFT JOIN users as sons
Bây giờ chúng ta có thể chỉ định mối quan hệ giữa bảng chính và bảng đã đổi tên:
LEFT JOIN users as sons ON sons.id=users.son_id
Bây giờ hãy chỉ định các trường:
SELECT
users.name as user_name, sons.name as son_name
Tổng hợp tất cả lại, chúng ta có truy vấn sau:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Bài tập thực hành
Giả sử chúng ta có các danh mục. Mỗi danh mục có thể thuộc về một danh mục cha, danh mục cha đó lại thuộc về danh mục cha của nó và cứ tiếp tục như vậy. Hãy mô tả cấu trúc lưu trữ.
Viết truy vấn lấy thông tin một danh mục cùng với danh mục cha của nó.
Viết truy vấn lấy thông tin một danh mục cùng với cha và ông của nó (danh mục cấp trên hai bậc).
Viết truy vấn lấy thông tin một danh mục cùng với cha, ông và cụ của nó (danh mục cấp trên ba bậc).