মডিউল পাঠ (2/4)
স্ব-যোগদান: নিজের সাথে একটি টেবিল
কখনও কখনও আপনি যে সম্পর্কটি অতিক্রম করতে চান তা দুজনের মধ্যে নয়
ভিন্ন টেবিল, কিন্তু একই টেবিলের সারি মধ্যে। সাধারণ উদাহরণ: ক
"বিভাগ → উপশ্রেণি" শ্রেণিবিন্যাস, যেখানে পিতামাতা এবং শিশু উভয়ই এর সারি
একই categories টেবিল, একটি parent_id দ্বারা সংযুক্ত।
এক সারি (শিশু) এবং "তার" অন্য সারি (পিতামাতা) একসাথে পড়তে আপনি একটি ব্যবহার করেন
স্ব-যোগদান: একই সারণী 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 প্রদান করে, যেখানেLEFT JOINএর সাথে সারির কারণেCOUNT(*)1 ফেরত দেবে NULL
নিজে চেষ্টা করে দেখুন
প্রতি ogni sotto-categoria (categorie con parent_id NOT NULL), mostra il nome della sotto-categoria e il nome della sua categoria-padre. ডিউ কোলন: উপশ্রেণী, বিভাগ। উপশ্রেণি প্রতি বিভাগ poi প্রতি Ordina.
ইঙ্গিত দেখান
লা কনডিজিয়ন ডেল সেলফ-জোইন è child.parent_id = parent.id.
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ব্যায়াম পর্যালোচনা করুন
প্রতি ogni শ্রেণীবিভাগ-মূল (parent_id IS NULL), mostra il nome e il numero di sotto-categorie. ডিউ কোলন: নাম, শিশু। নাম অনুযায়ী Ordina. ইনক্লুডি una eventuale radice senza figlie con 0.
ইঙ্গিত দেখান
দুইবার বিভাগগুলিতে বাম যোগ দিন (পিতামাতার জন্য ওরফে পি, সন্তানের জন্য c)। COUNT(c.id) ব্যবহার করুন, COUNT(*) নয়, শিশু ছাড়া মূলে 0 পেতে।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ