مشاهده نسخه کامل
: مشکل در دستور sql
سلام
من دارم برای یه آژانس مسافرتی برنامه می نویسم که در دیتابیسش یه جدول هست مربوط به تورهای گردشگری که داره
و یه جدول هم دارم برای عکس های مربوط به این تورها که البته برای یه تور ممکنه چند عکس وجود دشته باشه
حالا من می خوام در یه صفحه لیستی از تورها رو به همراه یکی از عکس های مربوط به اون ببینم و به علت اینکه همونجور که گقتم برای یه تور ممکنه چند عکس باشه برای یه تور اصلا عکسی نباشه و من می خوام فقط یکبار هر تور نشون داده بشه اومدم جدول تورها رو با جدول عکس left outer join کردم و روی فیلد id_tour این join رو انجام دادم
اما حالا دو تا مشکل دارم
اولیش اینکه: برای تورهایی که عکسی ندارن id_tour مقداری نداره
دوم این که می خوام هر تور فقط بکیار نشون داده بشه اما این مسئله رو نمی دونم چه جور حل کنم چون distinct فقط سطرهایی رو حذف می کنه که کل فیلد های اونها تکراری هستند از طرفی وقتی distinct هم می زارم باز هم error میده
می دونم که این مسئله رو می شه بدون join هم حل کرد اما من می خوام حتما با join بنویسم
MATRIX reloaded
29-03-2009, 14:43
این مشکل رو من هم داشتم. امیدوارم کسی راه حلی داشته باشه
David.Jn
29-03-2009, 17:05
در مورد مشکل اولتون نباید هم مقدار داشته باشه چون وقتی اونطرف برای این id عکسی وجود نداره انتظار دارید عکس چی نمایش بده و باید هم NULL نشون بده.
ولی اگر میخواهید توری که عکس ندارد رو نمایش ندهید میتونید از کوئری زیر در ادامه کوئریتون استفاده کنید
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
و اصلآ میتونید جای تیبل چپ و راستی رو عوض کنید که اونوقت حتی به این کوئری که بالا گفتم هم نیاز ندارین.
مشکل دومتون شاید راهی وجود دشته باشه ولی چون تو join کردن میگیم که ردیفهایی رو برام بیار که تو اونیکی تیبل فیلد فلانش با این شبیه باشه
پس اونم میاد به ازای هر شباهت چک میکنه و نمایش میده
واگر هم بشه ردیفهای این یکی رو محدود کرد به یدونه نمایش دادن فیلدهای تکراریش NULL میشه.
ولی باز نمیدونم شاید راهی وجود داشه باشه.
----------------------------------------------------
راستی چرا left outer join میزنید چرا از خود left join استفاده نمیکنین؟!چون کار جفتشون مثل همه.
واینکه اونجوری که من از ساختار جداولتون فهمیدم شما میتونین با یه natural join هم دخلشو بیارین.
--------------------------------------------------
باز میگم کاش یه بخش واسه پایگاه داده داشتیم(خطاب به بچز مدیر)
خوب فکر کنم من مظورم رو بد گفتم ببنید جدول ها به شکل زیر هست:
tour(id_tour,tour_title,capacity,country,type,date _of_dep,date_of_ret)
images(id_image,id_tour,title,url)
حالا من می خوام هر تور رو به همراه عکسش فقط یکبار نشون بدم اگر روی id_tour بخوامnatural join انجام بدم اونوقت تورهایی که عکسی ندارن نشون داده نمی شن از طرفی من وقتی left join انجام می دم توری که عکس هم نداره نشون داده می شه فقط مشکلش اینه که id_tour مقدار نداره
فکر کنم الان واضح تر گفته باشم
David.Jn
30-03-2009, 12:59
بزارید قذم به قدم بریم جلو
ببینید NATURAL JOIN هم میتونه به شما کمک کنه ولی مثل اینکه شما به ردیفهایی که عکس ندارن هم نیاز دارین پس باید با همون LEFT JOIN کارتون رو پیش ببرین.
حالا شما اومدین دوباره تو توضیحاتتون میگین:
از طرفی من وقتی left join انجام می دم توری که عکس هم نداره نشون داده می شه فقط مشکلش اینه که id_tour مقدار نداره
خوب شما وقتی دارین بر حسب id_tour چک میکنید اون میاد این فیلد رو چک میکنه و وقتی رکورد مشترک پیدا نمیکنه مجبوره که NULL بده.
یعنی برای اون id_tour ای که تو جدول tour دارین مفداری همانندش تو جدول img گیر نیاوارده.
اگه مبخواین نتیجتون فقط یکی باشه اونوفت عکس هم باید یدونه نمایش بدین
مثلآ میتویند با GROUP BY فیلدهای تکراری روی که تو جدول tour بوجود آمده رو گروه بندی کنید که اونوقت منجر میشه که یه عکس فقط نمایش داده بشه ولی از تکرار شدن جلوگیری میکنه
خوب تصور من اینه که (یعنی تا حالا همش بهمون اینجوری گفتن)
با توجه به اینکه left join انجام می دیم و جدول tour در سمت چپ join قرار دارد برای سطرهایی هم که مقدار متناظری در جدول image وجود نداره باید id_tour از جدول tour در نتیجه قرار بگیره
این چیزیه که من یاد گرفتم که البته نمی دونم درسته یا نه چون الان این مسئله اتفاق نمی افتد
مشکل چند تا عکس برای یه تور هم همون جور که گفتید با group حل می شه
ولی مشکل اول هنوز باقیه
David.Jn
01-04-2009, 14:10
با توجه به اینکه left join انجام می دیم و جدول tour در سمت چپ join قرار دارد برای سطرهایی هم که مقدار متناظری در جدول image وجود نداره باید id_tour از جدول tour در نتیجه قرار بگیره
این چیزیه که من یاد گرفتم که البته نمی دونم درسته یا نه چون الان این مسئله اتفاق نمی افتد
تصورتون و چیزی که یاد گرفتین کاملآ درسته ولی شما یکم منظورتون رو بد رسوندید.
من فکر میکردم شما تو جدول سمت راستی برای id_tour مقداری ندارین یعنی اونجا NULL نشون میده.
ولی اینجوری که میگین تو سمت چپی چیزی نشون داده نمیشه!
اگه کوئریتون رو درست نوشته باشین باید اون رکوردهای اون id رو تو جدول چپی نشون بده ولی تو سمت راستی NULL بده . مگر اینکه شما از دستور زیر استفاده کرده باشین!
برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
milky way
01-04-2009, 14:57
مگه رابطه بین این دو جدول یک به چند نیست پس وقتی Left Join میکنی باید id_tour باقی بمونه، اگر تو جدول images نباشه id_image و بقیه مقادیرش باید Null بشه. شما یجا داری اشتباه میکنی، شاید روی id_tour جدول images داری select میزنی.
نه از این بابت مطمئنم
ولی با اینحال روی چند تا جدول ساده این عمل رو انجام دادم به این نتیجه رسیدم که وقتی left join انجام می دیم مقداری که روش join انجام می دیم در صورتی که در اون یکی جدول نباشه null می گیره تنها ره حلش هم اینه که اون فیلدی که روش join انجام می دید رو براشون در دو تا جدول دو تا اسم متفاوت بزارید حل مشه
این حاصل کار امروز من بوده حالا نمی دونم چقدر درسته؟
David.Jn
02-04-2009, 00:31
نه از این بابت مطمئنم
ولی با اینحال روی چند تا جدول ساده این عمل رو انجام دادم به این نتیجه رسیدم که وقتی left join انجام می دیم مقداری که روش join انجام می دیم در صورتی که در اون یکی جدول نباشه null می گیره
واقعآ خسته نباشید این اون چیزیه که من تو هر سه تا پستم داشتم میگفتم!
تنها ره حلش هم اینه که اون فیلدی که روش join انجام می دید رو براشون در دو تا جدول دو تا اسم متفاوت بزارید حل مشه
این حاصل کار امروز من بوده حالا نمی دونم چقدر درسته؟
چه ربطی به اسم فیلدها داره اصل محتوای داخل فیلدهاست نه اسمشون
این محتواست که تو join کردن میاد مچ میشه.
موقع طراحی تیبل ها میایم یک یا چند تا فیلد رو همنام میدیم چون مقادیرشون مشترکه و با هم دیگه ارتباط دارن. همین
ممنون شما هم خسته نباشید
خوب تصور من اینه که (یعنی تا حالا همش بهمون اینجوری گفتن)
با توجه به اینکه left join انجام می دیم و جدول tour در سمت چپ join قرار دارد برای سطرهایی هم که مقدار متناظری در جدول image وجود نداره باید id_tour از جدول tour در نتیجه قرار بگیره
خوب من فکر کنم ما دو نفر تو درک این موضوع مشکل داریم شما این تکه رو قبول داری؟
توی sql server که قدیما کار می کردم این موضوع کاملا رعایت می شد
درصورتی که توی mysql رعایت نمی شه
چه ربطی به اسم فیلدها داره اصل محتوای داخل فیلدهاست نه اسمشون
این محتواست که تو join کردن میاد مچ میشه.
موقع طراحی تیبل ها میایم یک یا چند تا فیلد رو همنام میدیم چون مقادیرشون مشترکه و با هم دیگه ارتباط دارن. همین
خوب من هم فکر می کردم ربطی نداره اما myaql به من ثابت کرد که خیلی ربط داره
من که نفهمیدم مشکل از کجاست،
من برای چندین جا که نیاز به تصاویر داشت اینکار رو انجام دادم؛
تقریباً 10 تصویر رو در نظر گرفتم یعنی حداکثر 10 تا تصویر میتونید انتخاب کنید، شاید هم تصویری انتخاب نشه،
نام گذاری تصاویر رو هم یا یه رندوم و یه عدد ثابت انجام دادم، مثلاً:
01_21325432151
02_21325432151
.
.
.
و نیازی به دو تا جدول نیست اگر تصویر انتخاب شده باشه آدرسش قرار میگیره و اگر هم تصویر انتخاب نشده باشه - قرار میگیره.
هنگام نمایش هم اگر قصد دارید فقط سطرهای دارای عکس نمایش داده بشه می تونید هنگام درج یک فیلد رو اختصاص بدید که اگر تصویر انتخاب شده این فیلد دارای مقدار 1 و در غیر اینصورت مقدار 0 بگیره ...
موقع انتخاب هم به شرط اینکه فیلد مورد نظری که بالا ذکر شده دارای مقدار یک باشه ...
چی گفتم ...
اگر فهمیدی خوب خدا رو شکر اگر متوجه نشدید، مشکل اصلیتون رو واضح بگید تا بفهمم و راه حلّی ارائه بدم ...
David.Jn
03-04-2009, 18:41
ببینید دوست من حتمآ شما کوئریتون مشکل داره
وگرنه باید رکوردی که مقدار مشترک نداره null نمایش داده بشه(تو left join)
اینم یه مدل select کردنه دیگه چه ربطی به نام فیلدها داره! (اصلآ منطقی نیست)
من که نفهمیدم مشکل از کجاست،
من برای چندین جا که نیاز به تصاویر داشت اینکار رو انجام دادم؛
تقریباً 10 تصویر رو در نظر گرفتم یعنی حداکثر 10 تا تصویر میتونید انتخاب کنید، شاید هم تصویری انتخاب نشه،
نام گذاری تصاویر رو هم یا یه رندوم و یه عدد ثابت انجام دادم، مثلاً:
01_21325432151
02_21325432151
.
.
.
و نیازی به دو تا جدول نیست اگر تصویر انتخاب شده باشه آدرسش قرار میگیره و اگر هم تصویر انتخاب نشده باشه - قرار میگیره.
هنگام نمایش هم اگر قصد دارید فقط سطرهای دارای عکس نمایش داده بشه می تونید هنگام درج یک فیلد رو اختصاص بدید که اگر تصویر انتخاب شده این فیلد دارای مقدار 1 و در غیر اینصورت مقدار 0 بگیره ...
موقع انتخاب هم به شرط اینکه فیلد مورد نظری که بالا ذکر شده دارای مقدار یک باشه ...
چی گفتم ...
اگر فهمیدی خوب خدا رو شکر اگر متوجه نشدید، مشکل اصلیتون رو واضح بگید تا بفهمم و راه حلّی ارائه بدم ...
بله متوجه شدم
ببینید دوست من حتمآ شما کوئریتون مشکل داره
وگرنه باید رکوردی که مقدار مشترک نداره null نمایش داده بشه(تو left join)
اینم یه مدل select کردنه دیگه چه ربطی به نام فیلدها داره! (اصلآ منطقی نیست)
والل... من هم نمی دونم چه ربطی داره
یعنی شما نظرت اینه که اون فیلد مشترک که در یکی از جدول ها مقدار داره و توی اون یکی نداره باید null بگیره؟
هرچند که دوستان من مشکلاتم حل شده
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.