مفهوم Left Join در کوئری گرفتن

parsiteam

Member
سلام دوستان . راستش من یک کوئری خیلی بزرگ دیدم . این طرف همش اومده از دستور Left Join استفاده کرده . میشه بگین این دستور در یک کوئری چه کاری انجام میده ؟ اینم کوئری :



PHP:
Original query: insert into SemesterAccLog(LesCode,GrpCode,LesName,ProName,LesFeeDesc,amount,TotalAmount,LesUnit,TimeAction,CourseStatus) select PL.LesCode, GrpCode,PLesName, if (trim(Prof.PProLName) = '' , ' استاد مشخص نیست ', Prof.PProLName) as PProLName , LesFeeDesc,ifnull(fee,0) as amount, (IFNULL(round(fee * LesFeeTotalUnit,-1),0)*(IsExension(8715415074,PL.LesCode,1387,2))) as TotalAmount, LesFeeTotalUnit, ActionPeriod, CourseStatus from SelectedCourses SC inner join StudentSpecs sp on (sp.StNo = SC.StNo) left join PresentedLessons PL on (SC.LesID = PL.LesID) left join professors Prof on (PL.ProCode = Prof.ProCode) left join lessons L on (L.LesCode = PL.LesCode ) left join LesFeeTypes LFT on (L.LesFeeCode = LFT.LesFeeCode ) left join ngLessonTuition LT on (LT.LesFeeCode = LFT.LesFeeCode and LT.EduYear = 1387 and LT.semester = 1 and LT.StartingYear = sp.StartingYear and LT.FldCode = sp.FldCode and LT.meliat =sp.meliat and LT.EduSecCode = sp.EduSecCode) where SC.StNo='8715415074' and PL.EduYear = 1387 and PL.semester = 2 and ((ActionPeriod<=82 and CourseStatus<>61 ) || (ActionPeriod>82 and ActionPeriod<>84))


با تشکر .
 

Cyletech

Member
این آموزش انگلیسیش: اینجا کلیک کن.

برای پیدا کردن ردیف هایی (rows) که در بعضی از جدول ها وجود ندارد. اینهم یک نمونه ساده از استفاده از LEFT JOIN:

PHP:
SELECT *
  FROM a JOIN b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)
  WHERE b.key=d.key;
 

sunrise

Member
در حقيقت با استفاده از دستورهاي LEFT JOIN و INNER JOIN شما دو جدول رو در همديگه ضرب دکارتي مي کنيد (پيوند زدن چند جدول با همديگه) و براساس يک فيلد که در جدول اول کليد خارجي محسوب ميشه و در جدولي که قصد پيوند با اون رو داريد يک کليد اصلي هست مورد استفاده قرار مي گيره.

به مثال ساده زير توجه کنيد: فرض کنيد ما دو جدول به نام هاي people و city داريم و فيلدهاي جداول بصورت زير هست:

[ltr]Table 'people'
pid INT(10),
fullname VARCHAR(60),
cityid SMALLINT(5),
PRIMARY KEY(pid)

Table 'city'
cityid SMALLINT(5),
name VARCHAR(40),
PRIMARY KEY(cityid)[/ltr]

حال ما قصد داريم يک پرس و جو توليد کنيم که علاوه بر اينکه مشخصات افراد رو استخراج مي کنه، نام شهر هر کدوم رو نيز از جدول city بخونه (بر اساس cityid) و در يک فيلد با نام cityname برگردونه، پرس و جوي ما بصورت زير خواهد بود:
کد:
SELECT people.*, city.name AS cityname
FROM people
LEFT JOIN city ON (city.cityid = people.cityid)
ORDER BY people.pid ASC
اگر اطلاعات هر يک از جداول بصورت زير باشه:
[ltr]
people
pid ----------- fullname ----------- cityid
1-------------- Hamed------------- 5
2 ------------- Ali ------------------ 8
3 ------------- Sara --------------- 5

city
cityid -------------- name
5 ------------------ Mashhad
8 ------------------ Tehran
15 ----------------- Isfahan
[/ltr]
در اين حالت نتيجه بصورت زير خواهد بود:
[ltr]
pid ------------------ fullname ------------------ cityid ------------------ cityname
1 -------------------- Hamed -------------------- 5 ---------------------- Mashhad
2 -------------------- Ali ------------------------- 8 ---------------------- Tehran
3 -------------------- Sara ---------------------- 5 ----------------------- Mashhad
[/ltr]

اميدوارم اين مثال ساده بتونه به درک بيشتر شما در اين زمينه کمک کنه، البته بهتون توصيه مي کنم اگه دوست داريد که يک پرس و جو نويس خوب شويد، با داده ها و فيلدها بازي کنيد و تا مي تونيد بهترين کوئري ها رو توليد کنيد و سعي کنيد تا مي تونيد با استفاده از يک پرس و جو تمامي داده هاي مورد نياز و بهم مرتبط رو استخراج کنيد.
 

parsiteam

Member
ممنون . عالی بود . متوجه شدم . من همیشه یک پرس و جو که انجام میدم بعد با استفاده از پرس و جوی اولیه , پرس و جوی دوم رو مینویسم . مثلا id رو که از اولی میگیرم بعد داخل دومی استفاده میکنم . میخواستم بدونم این روش بهتره یا اینکه یک پرس و جوی طولانی بنویسم ؟
 

sunrise

Member
ممنون . عالی بود . متوجه شدم . من همیشه یک پرس و جو که انجام میدم بعد با استفاده از پرس و جوی اولیه , پرس و جوی دوم رو مینویسم . مثلا id رو که از اولی میگیرم بعد داخل دومی استفاده میکنم . میخواستم بدونم این روش بهتره یا اینکه یک پرس و جوی طولانی بنویسم ؟
البته در برخي موارد توصيه ميشه که به جاي استفاده از دستورات پيوند از پرس و جوهاي تو در تو استفاده بشه منتها حالت عوام پسوند اون همين left join و inner join هست که البته بعد از اينکه در مورد پرس و جوها کمي حرفه اي شديد مي تونيد تشخيص بديد که کجا بهتره از پرس و جوي تو در تو استفاده بشه و کجا از پيوند.

موفق باشيد.
 

جدیدترین ارسال ها

بالا