PHP'de Verilerin Aile Bağlantıları
Önümüzde babaları ve oğulları saklama görevinin olduğunu varsayalım. Her babanın sadece bir oğlu olabilsin ve oğul da sırayla bir oğula sahip olabilsin.
Verileri nasıl saklayacağımızı düşünmemiz
gerekiyor. Akla gelebilecek ilk fikir - iki
tablo yapmak: babalar için parents
ve oğullar için sons. Sonra bu
tabloları bir alanla ilişkilendirmek:
son_id veya parent_id.
Ancak, bu çok iyi bir fikir değil - çünkü aynı kişi hem baba hem de oğul olabilir - ve onu her iki tabloda saklamak zorunda kalırız, bu da kullanışsızdır, daha fazla yer kaplar ve kolayca hatalara yol açar.
Daha iyi bir seçenek - tabloyu kendisiyle
ilişkilendirmek: bir users tablosu
yapalım, içinde tüm kullanıcıları saklayalım
ve her birine, içinde aynı tablodan oğlunun
idsinin saklanacağı bir son_id
alanı yapalım:
| id | name | son_id |
|---|---|---|
| 1 | user1 | 2 |
| 2 | user2 | 3 |
| 3 | user3 | null |
Sorgular
Şimdi bir kullanıcıyı onun oğluyla birlikte getiren bir sorgu yazalım.
Öncelikle sadece kullanıcıları getirelim:
SELECT
*
FROM
users
Şimdi kullanıcılara onların oğullarını join edelim. Join işlemini tabloyu kendisine yapacağız, bu yüzden onun yeniden adlandırılmasını yapmamız gerekiyor:
LEFT JOIN users as sons
Şimdi ana tablo ile yeniden adlandırılmış tablo arasındaki ilişkiyi belirtebiliriz:
LEFT JOIN users as sons ON sons.id=users.son_id
Şimdi alanları belirtelim:
SELECT
users.name as user_name, sons.name as son_name
Hepsini bir araya getirelim ve aşağıdaki sorguyu elde edelim:
SELECT
users.name as user_name, sons.name as son_name
FROM
users
LEFT JOIN users as sons ON sons.id=users.son_id
Pratik Görevler
Elimizde kategoriler olduğunu varsayalım. Her kategori bir üst kategoriye ait olabilir, o da sırayla kendi üst kategorisine ait olabilir ve bu böyle devam eder. Saklama yapısını açıklayın.
Bir kategoriyi onun üst kategorisiyle birlikte getiren bir sorgu yazın.
Bir kategoriyi onun üst kategorisi ve üst-üst kategorisiyle birlikte getiren bir sorgu yazın.
Bir kategoriyi onun üst kategorisi, üst-üst kategorisi ve üst-üst-üst kategorisiyle birlikte getiren bir sorgu yazın.