ماڈیول اسباق (2/4)
سیلف جوائن: اپنے ساتھ ایک میز
بعض اوقات آپ جس رشتے کو عبور کرنا چاہتے ہیں وہ دونوں کے درمیان نہیں ہوتا ہے۔
مختلف میزیں، لیکن ایک ہی میز کی قطاروں کے درمیان۔ عام مثال: a
"زمرہ → ذیلی زمرہ" درجہ بندی، جہاں والدین اور بچہ دونوں کی قطاریں ہیں
وہی categories ٹیبل، جو ایک parent_id سے منسلک ہے۔
ایک قطار (بچہ) اور "اس کی" دوسری قطار (والدین) کو ایک ساتھ پڑھنے کے لیے آپ a استعمال کرتے ہیں۔
خود شمولیت: ایک ہی جدول FROM میں دو بار ظاہر ہوتا ہے، دو کے ساتھ
مختلف القابات.
نحو
SELECT colonne
FROM tabella AS alias_a
JOIN tabella AS alias_b ON alias_a.foreign_key = alias_b.id;عرف لازمی ہے: اگر ہم AS a / AS b کو چھوڑ دیتے ہیں، PostgreSQL کے پاس کوئی نہیں ہے
یہ جاننے کا طریقہ کہ جب ہم name یا id لکھتے ہیں تو ہمارا مطلب دو کاپیوں میں سے کون سا ہے۔
-- Ogni sotto-categoria con il nome della categoria padre:
SELECT child.name AS subcategory,
parent.name AS category
FROM categories AS child
JOIN categories AS parent ON child.parent_id = parent.id;سادہ انگریزی میں پڑھیں: "categories کی قطاریں لیں بچہ، اور
ہر ایک کے لیے categories کی قطار تلاش کریں جس کا نام والدین ہے جس کا id ہے
بچے کا parent_id"۔
نتیجہ روٹ زمرہ جات کو خارج کرتا ہے (جن میں parent_id = NULL)
کیونکہ ایک INNER JOIN بغیر مماثلت کے قطاروں کو چھوڑ دیتا ہے۔ اگر آپ شامل کرنا چاہتے ہیں۔
انہیں، LEFT JOIN استعمال کریں۔
"جڑیں بھی رکھنے" کے لیے بائیں بازو کے ساتھ خود شامل ہوں
-- Tutte le categorie, con nome del padre o NULL se sono radice:
SELECT child.name AS category,
parent.name AS parent
FROM categories AS child
LEFT JOIN categories AS parent ON child.parent_id = parent.id;اب آپ کو parent = NULL کے ساتھ 9 قطاریں (ڈیٹا سیٹ میں ہر زمرہ) ملتی ہیں۔
3 جڑوں کے لئے.
خود شمولیت کے ساتھ جمع کرنا
یہ GROUP BY کے ساتھ بہت اچھی طرح سے یہ پوچھتا ہے کہ "ہر ایک کتنے بچے کرتا ہے
والدین کے پاس ہے":
SELECT p.name AS parent_category,
COUNT(c.id) AS children
FROM categories AS p
LEFT JOIN categories AS c ON c.parent_id = p.id
WHERE p.parent_id IS NULL -- solo le radici
GROUP BY p.name
ORDER BY p.name;دو اہم تفصیلات نوٹ کریں:
WHERE p.parent_id IS NULLفلٹرز جوائن سے پہلے: ہم صرف لیتے ہیں جڑیں بطور "بائیں ہاتھ کی میز"۔COUNT(c.id)(نہیںCOUNT(*)) بغیر بچوں کے جڑوں کے لئے 0 لوٹاتا ہے، جبکہCOUNT(*)اس کے ساتھLEFT JOINقطار کی وجہ سے 1 لوٹائے گا NULL
خود ہی آزمائیں۔
فی ogni sotto-categoria (categorie con parent_id NOT NULL)، mostra il nome della sotto-categoria e il nome della sua categoria-padre. ڈیو کالون: ذیلی زمرہ، زمرہ۔ Ordina فی زمرہ poi فی ذیلی زمرہ.
اشارہ دکھائیں۔
La condizione del self-JOIN è child.parent_id = parent.id۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
فی ogni زمرہ-ریڈیس (والدین_آئی ڈی NULL ہے)، mostra il nome e il numero di sotto-categorie. ڈیو کالون: نام، بچے۔ Ordina فی نام. انکلوڈی یونا ایونٹوئل ریڈیس سینزا فیگلی کون 0۔
اشارہ دکھائیں۔
زمرہ جات پر دو بار بائیں جوائن کریں (والدین کے لیے عرف p، بچے کے لیے c)۔ بغیر بچوں کے جڑوں پر 0 حاصل کرنے کے لیے COUNT(c.id) کا استعمال کریں، COUNT(*) کا نہیں۔
3 کوششوں کے بعد حل دستیاب ہے۔