SQLطرق ربط معلومات الجدول نفسه عند جلبها
- مفهوم الربط الذاتي
- تجهيز قاعدة البيانات التي سنطبق عليها
- طريقة ربط معلومات الجدول نفسه ببعضها عند جلبها
- أمثلة حول ربط معلومات الجدول نفسه ببعضها عند جلبها
مفهوم الربط الذاتي
في حال كان الجدول نفسه يحتوي على أعمدة قيمها مترابطة ببعضها البعض و تريد إسترجاعها بشكل مرتب، هنا يجب أن تربط الأعمدة مع بعضها بأسلوب يقال له ربط ذاتي ( Self Join ) لأننا نتعامل مع أعمدة موجودة في نفس الجدول.
حالات نطبق فيها الربط الذاتي
في مواقع التواصل الإجتماعي يمكنك وضع تعليق ( Comment ) على أي منشور ( Post ) تراه و بعدها يمكن لشخص آخر أن يضع تعليق آخر كردّ على تعليقك أنت. إذاً هنا عندنا ربط ذاتي لأن التعليق الجديد مرتبط بالتعليق الأول و كلاهما موضوع في نفس الجدول.
في صفحات الويب نفسها أحياناً تلاحظ أن صفحات الموقع نفسها مربوطة ببعضها فمثلاً تجد الموضوع يظهر لك أن الصفحة الفلانية تابعة لصفحة أخرى. في هذه الحالة أيضاً يوجد ربط ذاتي لأن الصفحة التي يظهر لك أنها تابعة لصفحة أخرى، هي صفحة مرتبطة بها و كلاهما موضوع في نفس الجدول.
تجهيز قاعدة البيانات التي سنطبق عليها
قم بتنفيذ الإستعلام التالي حتى تنشئ قاعدة بيانات جديدة إسمها harmash
و تنشئ فيها جدول إسمه employees
يحتوي على بيانات 5 موظفين.
مثال
فيما يلي البيانات التي قمنا بإضافتها في الجدول employees
.
id | name | manager_id |
---|---|---|
1 | Rami | NULL |
2 | Ahmad | 1 |
3 | Hanan | 1 |
4 | Saly | 1 |
5 | Samir | 1 |
نلاحظ أن جدول الموظفين يتضمن عامودين متشابهين هما id
و manager_id
و فكرتهما هي التالية:
- العمود
id
يحتوي على رقم تعرفة كل موظف. - العمود
manager_id
يحتوي على رقم تعرفة الموظف الذي يعتبر المدير بالنسبة للموظف.
قراءة بيانات الموظفين
- الموظف
Rami
، لا يوجد عندهmanager_id
و هذا يعني أنه هو المدير.
منطقياً إذا كنت موظف في شركة و لا يوجد مدير مسؤول عنك، فهذا يعني أنك أنت نفسك مدير الشركة. - الموظف
Ahmad
، مديره هو الموظف الذي يملك رقمid
يساوي1
، أي الموظفRami
هو مديره. - الموظفة
Hanan
، مديرها هو الموظف الذي يملك رقمid
يساوي1
، أي الموظفRami
هو مديره. - الموظفة
Saly
، مديرها هو الموظف الذي يملك رقمid
يساوي1
، أي الموظفRami
هو مديره. - الموظف
Samir
، مديره هو الموظف الذي يملك رقمid
يساوي1
، أي الموظفRami
هو مديره.
طريقة ربط معلومات الجدول نفسه ببعضها عند جلبها
لربط قيم الجدول نفسه ببعضها عند جلبها، نقوم بجلب قيم الجدول نفسه مرتين و من ثم نربطهما ببعضهما كأنهما جدولين منفصلين عن بعضهما بالضبط كما كنا نربط الجداول مع بعضها.
حتى تتمكن من جلب قيم الجدول نفسه مرتين، يجب أن تذكر إسم الجدول مرتين و تعطيه إسمين مختلفين. عندها يمكنك أن تتعامل معه و كأنه جدولين منفصلين.
في مثالنا الحالي، النسخة الأولى من الجدول employees
سنقوم بتسميتها e1
، و النسخة الثانية منه سنقوم بتسميتها e2
كما يلي.
أمثلة حول ربط معلومات الجدول نفسه ببعضها عند جلبها
الإستعلام التالي يقوم بجلب id
و name
كل موظف لديه مدير بالإضافة إلى name
الموظف الذي يعتبر مدير الشخص.
ما فعلناه لربط القيم المشتركة في الجدول نفسه ببعضها هو إعطاء الجدول إسمين مختلفين هما e1
و e2
مع وضع الكلمة JOIN بينهما. الصورة التالية توضح كيف سيتم ربط قيم الجدولين.
إذاً سيتم جلب قيم العمودين id
و name
من الجدول e1
, و قيم العمود name
من الجدول e2
.
المثال الأول
النتيجة
Employee ID | Employee | Manager |
---|---|---|
2 | Ahmad | Rami |
3 | Hanan | Rami |
4 | Saly | Rami |
5 | Samir | Rami |
الإستعلام التالي يقوم بجلب id
و name
كل موظف بالإضافة إلى name
الموظف الذي يعتبر مدير الشخص.
ما فعلناه لربط كل القيم الموجودة في الجدول نفسه ببعضها هو إعطاء الجدول إسمين مختلفين هما e1
و e2
مع وضع الكلمة LEFT JOIN بينهما. الصورة التالية توضح كيف سيتم ربط قيم الجدولين.
إذاً سيتم جلب قيم العمودين id
و name
من الجدول e1
، و قيم العمود name
من الجدول e2
.
المثال الثاني
النتيجة
Employee ID | Employee | Manager |
---|---|---|
1 | Rami | NULL |
2 | Ahmad | Rami |
3 | Hanan | Rami |
4 | Saly | Rami |
5 | Samir | Rami |
الإستعلام التالي هو نفسه الإستعلام الموضوع في المثال الثاني تماماً مع فرق واحد و هو أنه في حال كان الموظف لا يوجد عنده مدير - أي الحقل Manager
عنده يساوي NULL - سيتم تبديل قيمته بعبارة 'No Manager'.
المثال الثالث
النتيجة
Employee ID | Employee | Manager |
---|---|---|
1 | Rami | No Manager |
2 | Ahmad | Rami |
3 | Hanan | Rami |
4 | Saly | Rami |
5 | Samir | Rami |