در پایگاه دادههای رابطهای مانند MySQL، معمولاً از JOIN برای ترکیب دادههای دو یا چند جدول استفاده میشود.
اما در برخی موارد، ممکن است نیاز داشته باشیم که یک جدول را به خودش متصل کنیم. در این شرایط، از SELF JOIN استفاده میکنیم.
SELF JOIN نوعی JOIN است که در آن یک جدول به خودش متصل میشود تا رکوردهای آن با یکدیگر مقایسه شوند. این روش معمولاً برای نمایش روابط سلسلهمراتبی (مانند کارمندان و مدیران) یا یافتن دادههای مشابه در یک جدول استفاده میشود.
۱. SELF JOIN چیست؟
SELF JOIN همانند سایر انواع JOIN عمل میکند، اما به جای ترکیب دو جدول مختلف، یک جدول را به خودش متصل میکند.
✅ برای این کار، از نام مستعار (Alias) برای تمایز بین دو نسخه از جدول استفاده میشود.
ساختار کلی SELF JOIN در MySQL:
SELECT A.column_name, B.column_name
FROM table_name AS A
JOIN table_name AS B ON A.common_column = B.common_column;
✅ در این ساختار:
- A و B دو نسخه از یک جدول هستند که با استفاده از Alias (نام مستعار) ایجاد شدهاند.
- ON A.common_column = B.common_column شرطی است که تعیین میکند چگونه رکوردهای جدول با خودش مقایسه شوند.
۲. مثال کاربردی از SELF JOIN
سناریو: نمایش نام مدیر هر کارمند
فرض کنید یک شرکت جدول کارمندان (employees) دارد که شامل نام هر کارمند و شناسه مدیر آنها است. هر کارمند ممکن است یک مدیر داشته باشد که او نیز در همین جدول ذخیره شده است.
ساختار جدول employees:
CREATE TABLE employees (
emp_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
manager_id INT NULL
);
emp_id | name | manager_id |
---|---|---|
1 | علی احمدی | NULL |
2 | زهرا مرادی | 1 |
3 | رضا نوری | 1 |
4 | محمد حسینی | 2 |
✅ در این مثال:
- علی احمدی مدیر کل است و مدیری ندارد (NULL در manager_id).
- زهرا مرادی و رضا نوری تحت مدیریت علی احمدی (manager_id = 1) هستند.
- محمد حسینی تحت مدیریت زهرا مرادی (manager_id = 2) است.
۳. اجرای SELF JOIN برای نمایش نام مدیر هر کارمند
SELECT E1.name AS Employee, E2.name AS Manager
FROM employees AS E1
LEFT JOIN employees AS E2 ON E1.manager_id = E2.emp_id;
✅ نتیجه اجرای کوئری:
Employee | Manager |
---|---|
علی احمدی | NULL |
زهرا مرادی | علی احمدی |
رضا نوری | علی احمدی |
محمد حسینی | زهرا مرادی |
🔹 توضیح:
- SELF JOIN جدول را به خودش متصل کرده است.
- E1 (جدول کارمندان) نشاندهنده کارمندان است.
- E2 (جدول مدیران) نسخهای از همان جدول است که نقش مدیران را ایفا میکند.
- LEFT JOIN تضمین میکند که تمام کارمندان نمایش داده شوند، حتی اگر مدیری نداشته باشند (مانند علی احمدی).
۴. کاربردهای SELF JOIN در MySQL
✅ ۱. نمایش ساختار سلسلهمراتبی (مدیر و کارمند)
✅ ۲. یافتن رکوردهای تکراری یا مقایسه دادهها در یک جدول
✅ ۳. نمایش مشتریانی که معرف (معرفیکننده) دارند
✅ ۴. شناسایی محصولات مرتبط در یک جدول محصول
۵. کاربرد SELF JOIN برای یافتن رکوردهای مشابه
سناریو:
فرض کنید یک جدول customers داریم که اطلاعات مشتریان را ذخیره میکند. میخواهیم مشتریانی که در یک شهر زندگی میکنند را پیدا کنیم.
ساختار جدول customers:
CREATE TABLE customers (
customer_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
city VARCHAR(100) NOT NULL
);
customer_id | name | city |
---|---|---|
1 | علی احمدی | تهران |
2 | زهرا مرادی | مشهد |
3 | رضا نوری | تهران |
4 | محمد حسینی | اصفهان |
اجرای SELF JOIN برای یافتن مشتریان در یک شهر
SELECT C1.name AS Customer1, C2.name AS Customer2, C1.city
FROM customers AS C1
JOIN customers AS C2 ON C1.city = C2.city AND C1.customer_id <> C2.customer_id;
✅ نتیجه اجرای کوئری:
Customer1 | Customer2 | city |
---|---|---|
علی احمدی | رضا نوری | تهران |
رضا نوری | علی احمدی | تهران |
🔹 توضیح:
- C1 و C2 دو نسخه از جدول customers هستند.
- C1.city = C2.city تضمین میکند که مشتریان از یک شهر باشند.
- C1.customer_id <> C2.customer_id از مقایسه یک رکورد با خودش جلوگیری میکند.
۶. مقایسه SELF JOIN با سایر انواع JOIN
نوع JOIN | توضیح |
---|---|
INNER JOIN | ترکیب دادههای دو جدول بر اساس مقادیر مشترک. |
LEFT JOIN | نمایش تمام دادههای جدول چپ و دادههای منطبق از جدول راست. |
RIGHT JOIN | نمایش تمام دادههای جدول راست و دادههای منطبق از جدول چپ. |
SELF JOIN | ترکیب دادههای یک جدول با خودش برای مقایسه رکوردهای آن. |
۷. نکات مهم در استفاده از SELF JOIN
✔ SELF JOIN همیشه از Alias (نام مستعار) برای تمایز بین دو نسخه از جدول استفاده میکند.
✔ میتوان از INNER JOIN یا LEFT JOIN در ترکیب با SELF JOIN استفاده کرد.
✔ SELF JOIN معمولاً برای دادههای سلسلهمراتبی (مانند مدیر و کارمند) یا مقایسه دادههای یک جدول کاربرد دارد.
✔ شرط table1.id <> table2.id
معمولاً برای جلوگیری از مقایسه یک رکورد با خودش استفاده میشود.
۸. نتیجهگیری
SELF JOIN یک روش قدرتمند برای مقایسه رکوردهای یک جدول با خودش است. این روش معمولاً برای روابط سلسلهمراتبی، یافتن رکوردهای مشابه، نمایش مدیران و کارمندان، یا جستجوی دادههای مرتبط در یک جدول استفاده میشود.
نکات کلیدی:
✅ SELF JOIN جدول را به خودش متصل میکند.
✅ Alias برای تمایز بین دو نسخه از جدول استفاده میشود.
✅ میتوان از SELF JOIN برای نمایش سلسلهمراتب مدیر-کارمند استفاده کرد.
✅ میتوان از SELF JOIN برای یافتن دادههای مشابه (مثلاً مشتریان یک شهر) استفاده کرد.
با استفاده از SELF JOIN، میتوانید تحلیلهای دقیقتری از دادهها داشته باشید و گزارشهای بهتری تهیه کنید! 🚀