PDA

View Full Version : سوال: مشکل با join کردن سه جدول



idocsidocs
یک شنبه 27 مرداد 1392, 22:10 عصر
سه جدول برای نگه داری اطلاعات کاربرها، پرداختها و رد گیری مرسولات پستی دارم

سه جدول رو با هم join کردم و کوئری خوب کار می کنه ولی هر ردیف رو دوبار بر میگردونه

مشکل چیه؟


SELECT
t.statuse, p.price, l.name

FROM
trace t LEFT JOIN paytb p ON
(t.prodid = p.prodid AND t.sold=p.user_id && p.ok='yes' && p.type='online')

LEFT JOIN login l
ON (t.sold=l.user_id)

WHERE ( t.prodid='2500' )

MostafaEs3
یک شنبه 27 مرداد 1392, 23:00 عصر
//////////

idocsidocs
یک شنبه 27 مرداد 1392, 23:32 عصر
با GROUP BY میشه درستش کرد! باید بر اساس آی دی اصلی ردیف گروه بندی کنید.

به چه دلیل باید از GROUP BY استفاده کرد؟ ایراد خود کوئری چیه که چند سطر بر می گردونه؟

MostafaEs3
دوشنبه 28 مرداد 1392, 00:57 صبح
//////////

Unique
دوشنبه 28 مرداد 1392, 11:37 صبح
متاسفانه آقا مصطفی اشتباه میکنند و مشکل شما چیزی دیگست . آقا مصطفی مشکل صحبتشون اینه که شما دارین left join میکنند و نه inner join ! توی inner join ردیف های مرتبط روی ستون ها join جمع میشوند ولی روی left join فقط ردیف های اولین جدول توی query برمیگرده و join روی جداول دیگه فقط ستونهای بیشتری به query اضافه میکنه !ول

اما در مورد query شما مشکل اینجاست که شما بیش از یک ردیف توی جدول trace برای فروش ها به کاربر مورد نظر برای اون محصول مشخص شده دارین. که البته طبیعیه و اگه فقط trace مربوط به پرداختی که وضعیتش yes شده را نیاز دارین باید paytb بیاد جدول اولی و بقیه left join بشوند.

idocsidocs
دوشنبه 28 مرداد 1392, 12:01 عصر
اما در مورد query شما مشکل اینجاست که شما بیش از یک ردیف توی جدول trace برای فروش ها به کاربر مورد نظر برای اون محصول مشخص شده دارین. که البته طبیعیه و اگه فقط trace مربوط به پرداختی که وضعیتش yes شده را نیاز دارین باید paytb بیاد جدول اولی و بقیه left join بشوند.
جای paytb روتوی کوئری عوض کردم ولی بازم مشکل حل نشد

این امکان وجود داره از جدول paytb هم چندردیف برگردونده بشه و همون مشکل قبلی تکرار بشه.

وقتیکه توی کوئری ستونهای لولا رو انتخاب کردم:

ON t.prodid = p.prodid AND t.sold=p.user_id
چرا باز هم چند ستون بر گردونده می شه؟

نباید چنین ایرادی وجود داشته باشه

Unique
دوشنبه 28 مرداد 1392, 16:10 عصر
میشه دقیقا بگین جداول مروبوط به چی میشوند و شما دقیقا چه خروجی از اینها نیاز دارین ؟ توی left join رکورد ها از جدول اولی میان یعنی چه left join کنین چه نکنین تعداد رکورد ها یکی هستند ! چک کنین بدون left join ببینین چرا دو تا رکورد میده و کدومش در مورد نظر شما نیستش. بعدش با where میتونید محدود کنید و تعداد درست را بگیرین.

idocsidocs
دوشنبه 28 مرداد 1392, 19:45 عصر
میشه دقیقا بگین جداول مروبوط به چی میشوند و شما دقیقا چه خروجی از اینها نیاز دارین ؟ توی left join رکورد ها از جدول اولی میان یعنی چه left join کنین چه نکنین تعداد رکورد ها یکی هستند ! چک کنین بدون left join ببینین چرا دو تا رکورد میده و کدومش در مورد نظر شما نیستش. بعدش با where میتونید محدود کنید و تعداد درست را بگیرین.


توی سایتهای خارجی هم گشتم و همین مشکل رو داشتن و جواب درستی پیدا نکردم

یه جدول مربوط به اطلاعات خریداران ثبت نام کرده هست و فقط یه رکورد برگردونه می شه

اما جدول مربوط به اطلاعات پرداخت و جدول مربوط به اطلاعات ردگیری جداگانه هستن

جدول پرداخت آی دی کاربر و شماره کالا رو ذخیره می کنه و جدول ردگیری هم آی دی کاربر و شماره کالا رو ذخیره می کنه و بر اساس این دو فیلد تصمیم گیری می شه.

MostafaEs3
دوشنبه 28 مرداد 1392, 20:43 عصر
//////////

Unique
سه شنبه 29 مرداد 1392, 00:28 صبح
join مناسبترین راه حل هستش و استفاده از for خیلی آماتور بازیه ! مشکل شما اینه که باید دو تا رکورد را یکبار با همه ستون ها چک کنی و ببینی اختلافشون کجاست که حتما تفاوت خواهند داشت و در غیر این صورت شما حتما ۲ بار یک ردیف را ثبت کردین. بیش از این نمیتونم راهنمایی کنم چون نمیدونم جدول trace شما شامل چه ستونهایی است و در چه صورتی برای یک پرداخت چند ردیف توی trace خواهید داشت.

idocsidocs
شنبه 02 شهریور 1392, 16:17 عصر
مشکل پیدا شد!

باید از t.key=p.id استفاده می کردم تا دیتابیس بدونه که کدوم سطر از جدول رو بازیابی کنه.

چون ممکن بود هر کاربر از یک کالا چندبار سفارش بده و کوئری قبلی سطری که باید بازیابی می شد رو مشخص نمی کرد اما این کوئری که در ادامه نوشتم سطر مورد نظر رو مشخص می کنه و مشکلات قبلی ایجاد نمی شه


SELECT
t.statuse, p.price, l.name

FROM
trace t LEFT JOIN paytb p ON
(t.prodid = p.prodid && t.key=p.id && t.sold=p.user_id && p.ok='yes' && p.type='online')

LEFT JOIN login l
ON (t.sold=l.user_id)

WHERE ( t.prodid='2500' )