تالار گفتمان nCIS.ir

نسخه‌ی کامل: Join بین چند جدول
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
من یچند تا جدول دارم  که میخوام join بزنم و مقداریرو بخونم  
یکی از جدولها ممکنه مقداری نداشته باشه  و به همین علت کوئری هیچ نتیجه ای بر نمیگردونه
از چجور join  باید استفاده کنم که این موضوع رفع بشه

این کوئریمه


SELECT 
tpc.id           AS tpcId, 
tpc.user_id      AS tpcuser_id, 
tpc.departman_id AS tpcdepartman_id, 
tpc.periority_id AS tpcperiority_id, 
tpc.situation_id AS tpcsituation_id, 
tpc.file         AS tpcfile, 
tpc.create_date  AS tpcreate_date, 
tpc.title        AS tpctitle, 
tpc.body         AS tpcBody,
tpc.follow_code  AS tpcfollow_code,
user.id          AS userId, 
user.fname       AS userfname, 
user.lname       AS userlname, 
dpt.id           AS dptId, 
dpt.title        AS dpttitle,
prt.id           AS prtId,
prt.name         AS prtname,
stu.id           AS stuid,
stu.title        AS stutitle,
               fac.id           AS facId,
               fac.topic_id     AS factopic_id,
               fac.price        AS facPrice                
               fac.status       AS facStatus                
FROM topic tpc
LEFT OUTER JOIN users user
ON tpc.user_id = user.id
LEFT OUTER JOIN ticket_departman dpt 
ON tpc.departman_id = dpt.id 
LEFT OUTER JOIN periority prt 
ON prt.id = tpc.periority_id
LEFT OUTER JOIN situation stu 
ON tpc.situation_id = stu.id
               LEFT INNER JOIN factor fac
               ON tpc.id = fac.topic_id
WHERE(tpc.id = $topicId AND fac.topic_id = $topicId); 
");






[attachment=283]

[attachment=284]
برای آخری RIGHT JOIN بزنید ببینید درست میشه؟ ضمناً علت اینکه از INNER استفاده کردین چی بوده؟
نشد
اونم برای این بود ه داشتم تست میکردم همه مدل های JOINO
این تاپیکیه که کاربر میزنه و مدیر باید تعیین قیمت کنه برای تاپیک که کاربر هم ببینه و اگر خواست پرداخت کنه
من میخوام وقتی مدیر تاپیکی رو باز میکنه اگر تعیین قیمت شده بود که قیمت رو ببینه و اگر نشده بود تعیین قیمت کنه
JOIn میزنم و تمام اطلاعات رو میگیرم اما وقتی تاپیکی تعیین قیمت نشده باشه مقداری تو جدول فاکتور براش نیست
در نتیجه کلا کوئری بی نتیجه میشه و بقیه موارد تاپیک هم نمایش داده نمیشه
اگر فاکتوری صادر شده باشه نتیجه درسته با این کوئری
اما اگر فاکتوری صادر نشده باشه کلا هیچی بر نمیگردونه


SELECT 
		tpc.id           AS tpcId, 
		tpc.user_id      AS tpcuser_id, 
		tpc.departman_id AS tpcdepartman_id, 
		tpc.periority_id AS tpcperiority_id, 
		tpc.situation_id AS tpcsituation_id, 
		tpc.file         AS tpcfile, 
		tpc.create_date  AS tpcreate_date, 
		tpc.title        AS tpctitle, 
		tpc.body         AS tpcBody,
		tpc.follow_code  AS tpcfollow_code,
		user.id          AS userId, 	
		user.fname       AS userfname, 	
		user.lname       AS userlname, 	
		dpt.id           AS dptId, 
		dpt.title        AS dpttitle,
		prt.id           AS prtId,
		prt.name         AS prtname,
		stu.id           AS stuid,
		stu.title        AS stutitle,
                fac.id           AS facId,
                fac.topic_id     AS factopic_id,
                fac.price        AS facPrice,                
                fac.status       AS facStatus
                FROM topic tpc
		LEFT OUTER JOIN users user
		ON tpc.user_id = user.id
		LEFT OUTER JOIN ticket_departman dpt 
		ON tpc.departman_id = dpt.id 		
		LEFT OUTER JOIN periority prt 
		ON prt.id = tpc.periority_id
		LEFT OUTER JOIN situation stu 
		ON tpc.situation_id = stu.id
                LEFT OUTER JOIN factor fac
                ON fac.topic_id = tpc.id
		WHERE(tpc.id = 20 )



با این کوئری درست شد
و اگر مقداری در جدول آخر نباشه مقادیر اونو NUll برمیگردونه

این بخش از کد
ON tpc.id = fac.topic_id
با ید به این شکل اصلاح میشد

ON fac.topic_id = tpc.id
کلاً همیشه توی ارتباط LEFT JOIN و RIGHT JOIN بسته به اینکه از چپ جوین میزنید یا راست، کلید خارجی رو هم همونطرف باید بنویسید.