واضح آرشیو وب فارسی:سایت ریسک: View Full Version : مشکل در دستور sql nibble29-03-2009, 02:16 PMسلام من دارم برای یه آژانس مسافرتی برنامه می نویسم که در دیتابیسش یه جدول هست مربوط به تورهای گردشگری که داره و یه جدول هم دارم برای عکس های مربوط به این تورها که البته برای یه تور ممکنه چند عکس وجود دشته باشه حالا من می خوام در یه صفحه لیستی از تورها رو به همراه یکی از عکس های مربوط به اون ببینم و به علت اینکه همونجور که گقتم برای یه تور ممکنه چند عکس باشه برای یه تور اصلا عکسی نباشه و من می خوام فقط یکبار هر تور نشون داده بشه اومدم جدول تورها رو با جدول عکس left outer join کردم و روی فیلد id_tour این join رو انجام دادم اما حالا دو تا مشکل دارم اولیش اینکه: برای تورهایی که عکسی ندارن id_tour مقداری نداره دوم این که می خوام هر تور فقط بکیار نشون داده بشه اما این مسئله رو نمی دونم چه جور حل کنم چون distinct فقط سطرهایی رو حذف می کنه که کل فیلد های اونها تکراری هستند از طرفی وقتی distinct هم می زارم باز هم error میده می دونم که این مسئله رو می شه بدون join هم حل کرد اما من می خوام حتما با join بنویسم MATRIX reloaded29-03-2009, 03:43 PMاین مشکل رو من هم داشتم. امیدوارم کسی راه حلی داشته باشه zibatarin nam29-03-2009, 06:05 PMدر مورد مشکل اولتون نباید هم مقدار داشته باشه چون وقتی اونطرف برای این id عکسی وجود نداره انتظار دارید عکس چی نمایش بده و باید هم NULL نشون بده. ولی اگر میخواهید توری که عکس ندارد رو نمایش ندهید میتونید از کوئری زیر در ادامه کوئریتون استفاده کنید !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! و اصلآ میتونید جای تیبل چپ و راستی رو عوض کنید که اونوقت حتی به این کوئری که بالا گفتم هم نیاز ندارین. مشکل دومتون شاید راهی وجود دشته باشه ولی چون تو join کردن میگیم که ردیفهایی رو برام بیار که تو اونیکی تیبل فیلد فلانش با این شبیه باشه پس اونم میاد به ازای هر شباهت چک میکنه و نمایش میده واگر هم بشه ردیفهای این یکی رو محدود کرد به یدونه نمایش دادن فیلدهای تکراریش NULL میشه. ولی باز نمیدونم شاید راهی وجود داشه باشه. ---------------------------------------------------- راستی چرا left outer join میزنید چرا از خود left join استفاده نمیکنین؟!چون کار جفتشون مثل همه. واینکه اونجوری که من از ساختار جداولتون فهمیدم شما میتونین با یه natural join هم دخلشو بیارین. -------------------------------------------------- باز میگم کاش یه بخش واسه پایگاه داده داشتیم(خطاب به بچز مدیر) nibble29-03-2009, 10:50 PMخوب فکر کنم من مظورم رو بد گفتم ببنید جدول ها به شکل زیر هست: 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 مقدار نداره فکر کنم الان واضح تر گفته باشم zibatarin nam30-03-2009, 01:59 PMبزارید قذم به قدم بریم جلو ببینید NATURAL JOIN هم میتونه به شما کمک کنه ولی مثل اینکه شما به ردیفهایی که عکس ندارن هم نیاز دارین پس باید با همون LEFT JOIN کارتون رو پیش ببرین. حالا شما اومدین دوباره تو توضیحاتتون میگین: از طرفی من وقتی left join انجام می دم توری که عکس هم نداره نشون داده می شه فقط مشکلش اینه که id_tour مقدار نداره خوب شما وقتی دارین بر حسب id_tour چک میکنید اون میاد این فیلد رو چک میکنه و وقتی رکورد مشترک پیدا نمیکنه مجبوره که NULL بده. یعنی برای اون id_tour ای که تو جدول tour دارین مفداری همانندش تو جدول img گیر نیاوارده. اگه مبخواین نتیجتون فقط یکی باشه اونوفت عکس هم باید یدونه نمایش بدین مثلآ میتویند با GROUP BY فیلدهای تکراری روی که تو جدول tour بوجود آمده رو گروه بندی کنید که اونوقت منجر میشه که یه عکس فقط نمایش داده بشه ولی از تکرار شدن جلوگیری میکنه nibble01-04-2009, 02:15 PMخوب تصور من اینه که (یعنی تا حالا همش بهمون اینجوری گفتن) با توجه به اینکه left join انجام می دیم و جدول tour در سمت چپ join قرار دارد برای سطرهایی هم که مقدار متناظری در جدول image وجود نداره باید id_tour از جدول tour در نتیجه قرار بگیره این چیزیه که من یاد گرفتم که البته نمی دونم درسته یا نه چون الان این مسئله اتفاق نمی افتد مشکل چند تا عکس برای یه تور هم همون جور که گفتید با group حل می شه ولی مشکل اول هنوز باقیه zibatarin nam01-04-2009, 03:10 PMبا توجه به اینکه left join انجام می دیم و جدول tour در سمت چپ join قرار دارد برای سطرهایی هم که مقدار متناظری در جدول image وجود نداره باید id_tour از جدول tour در نتیجه قرار بگیره این چیزیه که من یاد گرفتم که البته نمی دونم درسته یا نه چون الان این مسئله اتفاق نمی افتد تصورتون و چیزی که یاد گرفتین کاملآ درسته ولی شما یکم منظورتون رو بد رسوندید. من فکر میکردم شما تو جدول سمت راستی برای id_tour مقداری ندارین یعنی اونجا NULL نشون میده. ولی اینجوری که میگین تو سمت چپی چیزی نشون داده نمیشه! اگه کوئریتون رو درست نوشته باشین باید اون رکوردهای اون id رو تو جدول چپی نشون بده ولی تو سمت راستی NULL بده . مگر اینکه شما از دستور زیر استفاده کرده باشین! !!!! برای مشاهده محتوا ، لطفا ثبت نام کنید / وارد شوید !!!! milky way01-04-2009, 03:57 PMمگه رابطه بین این دو جدول یک به چند نیست پس وقتی Left Join میکنی باید id_tour باقی بمونه، اگر تو جدول images نباشه id_image و بقیه مقادیرش باید Null بشه. شما یجا داری اشتباه میکنی، شاید روی id_tour جدول images داری select میزنی. nibble01-04-2009, 11:56 PMنه از این بابت مطمئنم ولی با اینحال روی چند تا جدول ساده این عمل رو انجام دادم به این نتیجه رسیدم که وقتی left join انجام می دیم مقداری که روش join انجام می دیم در صورتی که در اون یکی جدول نباشه null می گیره تنها ره حلش هم اینه که اون فیلدی که روش join انجام می دید رو براشون در دو تا جدول دو تا اسم متفاوت بزارید حل مشه این حاصل کار امروز من بوده حالا نمی دونم چقدر درسته؟ zibatarin nam02-04-2009, 01:31 AMنه از این بابت مطمئنم ولی با اینحال روی چند تا جدول ساده این عمل رو انجام دادم به این نتیجه رسیدم که وقتی left join انجام می دیم مقداری که روش join انجام می دیم در صورتی که در اون یکی جدول نباشه null می گیره واقعآ خسته نباشید این اون چیزیه که من تو هر سه تا پستم داشتم میگفتم! تنها ره حلش هم اینه که اون فیلدی که روش join انجام می دید رو براشون در دو تا جدول دو تا اسم متفاوت بزارید حل مشه این حاصل کار امروز من بوده حالا نمی دونم چقدر درسته؟ چه ربطی به اسم فیلدها داره اصل محتوای داخل فیلدهاست نه اسمشون این محتواست که تو join کردن میاد مچ میشه. موقع طراحی تیبل ها میایم یک یا چند تا فیلد رو همنام میدیم چون مقادیرشون مشترکه و با هم دیگه ارتباط دارن. همین nibble03-04-2009, 04:34 PMممنون شما هم خسته نباشید خوب تصور من اینه که (یعنی تا حالا همش بهمون اینجوری گفتن) با توجه به اینکه left join انجام می دیم و جدول tour در سمت چپ join قرار دارد برای سطرهایی هم که مقدار متناظری در جدول image وجود نداره باید id_tour از جدول tour در نتیجه قرار بگیره خوب من فکر کنم ما دو نفر تو درک این موضوع مشکل داریم شما این تکه رو قبول داری؟ توی sql server که قدیما کار می کردم این موضوع کاملا رعایت می شد درصورتی که توی mysql رعایت نمی شه چه ربطی به اسم فیلدها داره اصل محتوای داخل فیلدهاست نه اسمشون این محتواست که تو join کردن میاد مچ میشه. موقع طراحی تیبل ها میایم یک یا چند تا فیلد رو همنام میدیم چون مقادیرشون مشترکه و با هم دیگه ارتباط دارن. همین خوب من هم فکر می کردم ربطی نداره اما myaql به من ثابت کرد که خیلی ربط داره mohan2103-04-2009, 07:16 PMمن که نفهمیدم مشکل از کجاست، من برای چندین جا که نیاز به تصاویر داشت اینکار رو انجام دادم؛ تقریباً 10 تصویر رو در نظر گرفتم یعنی حداکثر 10 تا تصویر میتونید انتخاب کنید، شاید هم تصویری انتخاب نشه، نام گذاری تصاویر رو هم یا یه رندوم و یه عدد ثابت انجام دادم، مثلاً: 01_21325432151 02_21325432151 . . . و نیازی به دو تا جدول نیست اگر تصویر انتخاب شده باشه آدرسش قرار میگیره و اگر هم تصویر انتخاب نشده باشه - قرار میگیره. هنگام نمایش هم اگر قصد دارید فقط سطرهای دارای عکس نمایش داده بشه می تونید هنگام درج یک فیلد رو اختصاص بدید که اگر تصویر انتخاب شده این فیلد دارای مقدار 1 و در غیر اینصورت مقدار 0 بگیره ... موقع انتخاب هم به شرط اینکه فیلد مورد نظری که بالا ذکر شده دارای مقدار یک باشه ... چی گفتم ... اگر فهمیدی خوب خدا رو شکر اگر متوجه نشدید، مشکل اصلیتون رو واضح بگید تا بفهمم و راه حلّی ارائه بدم ... zibatarin nam03-04-2009, 07:41 PMببینید دوست من حتمآ شما کوئریتون مشکل داره وگرنه باید رکوردی که مقدار مشترک نداره null نمایش داده بشه(تو left join) اینم یه مدل select کردنه دیگه چه ربطی به نام فیلدها داره! (اصلآ منطقی نیست) nibble04-04-2009, 08:08 PMمن که نفهمیدم مشکل از کجاست، من برای چندین جا که نیاز به تصاویر داشت اینکار رو انجام دادم؛ تقریباً 10 تصویر رو در نظر گرفتم یعنی حداکثر 10 تا تصویر میتونید انتخاب کنید، شاید هم تصویری انتخاب نشه، نام گذاری تصاویر رو هم یا یه رندوم و یه عدد ثابت انجام دادم، مثلاً: 01_21325432151 02_21325432151 . . . و نیازی به دو تا جدول نیست اگر تصویر انتخاب شده باشه آدرسش قرار میگیره و اگر هم تصویر انتخاب نشده باشه - قرار میگیره. هنگام نمایش هم اگر قصد دارید فقط سطرهای دارای عکس نمایش داده بشه می تونید هنگام درج یک فیلد رو اختصاص بدید که اگر تصویر انتخاب شده این فیلد دارای مقدار 1 و در غیر اینصورت مقدار 0 بگیره ... موقع انتخاب هم به شرط اینکه فیلد مورد نظری که بالا ذکر شده دارای مقدار یک باشه ... چی گفتم ... اگر فهمیدی خوب خدا رو شکر اگر متوجه نشدید، مشکل اصلیتون رو واضح بگید تا بفهمم و راه حلّی ارائه بدم ... بله متوجه شدم ببینید دوست من حتمآ شما کوئریتون مشکل داره وگرنه باید رکوردی که مقدار مشترک نداره null نمایش داده بشه(تو left join) اینم یه مدل select کردنه دیگه چه ربطی به نام فیلدها داره! (اصلآ منطقی نیست) والل... من هم نمی دونم چه ربطی داره یعنی شما نظرت اینه که اون فیلد مشترک که در یکی از جدول ها مقدار داره و توی اون یکی نداره باید null بگیره؟ هرچند که دوستان من مشکلاتم حل شده سایت ما را در گوگل محبوب کنید با کلیک روی دکمه ای که در سمت چپ این منو با عنوان +1 قرار داده شده شما به این سایت مهر تأیید میزنید و به دوستانتان در صفحه جستجوی گوگل دیدن این سایت را پیشنهاد میکنید که این امر خود باعث افزایش رتبه سایت در گوگل میشود
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 751]