ورود

View Full Version : قرار دادن دو جدول sql در کنار هم



webnavard94
شنبه 10 خرداد 1399, 04:54 صبح
سلام.
من یک دیتابیس ساختم شامل جدولهای زیر:
course : cid , name,grade
student : sid, name, age, grade
courseStudent : id , sid , cid

که جدول courseStudent رابط برای ارتباط بین دو جدول هست و فیلدهای sid و cid این جدول با فیلدهای مربوطه در دو جدول دیگر کلید هستند. درسهایی که هر دانش آموز در آن ثبت نام کرده در این جدول ذخیره میشه.
حالا می خوام کوئری بنویسم که sid , name , age , grade , firstCourse ,SecondCourse را با هم نشان دهد. هر دانش آموز فقط تا دو درس می تواند ثبت نام کند. می خوام درسهای ثبت نام شده یک دانش آموز در یک ردیف نمایش داده بشه.
چطور باید بنویسم؟

webnavard94
یک شنبه 11 خرداد 1399, 08:55 صبح
لطفا اگر کسی میتونه راهنمایی کنه.الان نیاز دارم چند روز دیگه به دردم نمی خوره.

Mahmoud.Afrad
یک شنبه 11 خرداد 1399, 15:36 عصر
از pivot میتونید استفاده کنید.

mehdi_79
جمعه 16 خرداد 1399, 00:30 صبح
سلام
کدش رو برات نوشتم می تونی استفاده کنی :

select sc.sid,sc.name,sc.age,sc.grade,c1.name firstCourse ,c2.name SecondCourse
FROM
(SELECT student.sid, student.name, student.age, student.grade, min(course.cid) as min_CID, max(course.cid) as max_CID
FROM course INNER JOIN
courseStudent ON course.cid = courseStudent.cid INNER JOIN
student ON courseStudent.sid = student.sid
GROUP BY student.sid, student.name, student.age, student.grade) sc
LEFT OUTER JOIN (SELECT cid, name FROM course) C1
ON C1.cid = Sc.min_CID
LEFT OUTER JOIN (SELECT cid, name FROM course) C2
ON C2.cid = Sc.max_CID

webnavard94
شنبه 24 خرداد 1399, 21:08 عصر
با تشکر از شما
نتیجه کوئری شما اینطور میشه :151845
این نتیجه درست نیست. برای دانش آموزی که فقط درس اول را انتخاب کرده باید درس دوم null نشون داده بشه.

mehdi_79
شنبه 24 خرداد 1399, 23:18 عصر
سلام
اصلاحش راحته این کد رو امتحان کن :

select sc.sid,sc.name,sc.age,sc.grade,c1.name firstCourse ,c2.name SecondCourse
FROM
(SELECT student.sid, student.name, student.age, student.grade, min(course.cid) as min_CID,
case COUNT(course.cid)
when 1 then null
when 2 then max(course.cid)
end as max_CID
FROM course INNER JOIN
courseStudent ON course.cid = courseStudent.cid INNER JOIN
student ON courseStudent.sid = student.sid
GROUP BY student.sid, student.name, student.age, student.grade) sc
LEFT OUTER JOIN (SELECT cid, name FROM course) C1
ON C1.cid = Sc.min_CID
LEFT OUTER JOIN (SELECT cid, name FROM course) C2
ON C2.cid = Sc.max_CID

ولی کدی که نوشتم با توجه به دیتا بیس تو بود
استفاده از min و max برای دو درس جواب میده اگه درس سوم داشته باشی جواب نمیده
بهتره در جدول
course یک فیلد اضافه کنی و firstCourse و SecondCourse و .. رو بهش اضافه کنی
انوقت میشه کد کاملتری براش نوشت

webnavard94
دوشنبه 26 خرداد 1399, 11:36 صبح
سلام
اینکه از min و max برای تعیین درس اول و دوم استفاده کردید درست نیست.
درس با آی دی کمتر ممکنه درس انتخابی دوم باشه و درس با آیدی بزرگتر ممکنه درس انتخابی اول باشه.
در کد شما آیدی کمتر همیشه به عنوان درس اول انتخاب میشه.

mehdi_79
دوشنبه 26 خرداد 1399, 23:37 عصر
سلام
معمولا برای ID جدول نوع داده int با IDENTITY فعال قرار میدن که هر فیلد که اضافه شد یک شماره به ID اضافه بشه
در این خالت رکوردی که اول وارد جدول میشه ID کوچکتری داره و تنیجه درسته
اگه ID رو بخواهی خودت وارد کنی باز منطقی نیست رکوردی که اول وارد میشه مقدار بزرگتری داشته باشه
البته با توجه به طراحی دیتابیست کد های بهتری می تونی بنویسی
من فقط خواستم نمونه کد برای تبدیل سطر به ستون بهت بدم که نسبت به
pivot آسون تره