تبلیغات :
ماهان سرور
آکوستیک ، فوم شانه تخم مرغی ، پنل صداگیر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




صفحه 1 از 2 12 آخرآخر
نمايش نتايج 1 به 10 از 14

نام تاپيک: مشکل در دستور sql

  1. #1
    اگه نباشه جاش خالی می مونه nibble's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    USA Boston MA
    پست ها
    477

    11 مشکل در دستور sql

    سلام
    من دارم برای یه آژانس مسافرتی برنامه می نویسم که در دیتابیسش یه جدول هست مربوط به تورهای گردشگری که داره
    و یه جدول هم دارم برای عکس های مربوط به این تورها که البته برای یه تور ممکنه چند عکس وجود دشته باشه
    حالا من می خوام در یه صفحه لیستی از تورها رو به همراه یکی از عکس های مربوط به اون ببینم و به علت اینکه همونجور که گقتم برای یه تور ممکنه چند عکس باشه برای یه تور اصلا عکسی نباشه و من می خوام فقط یکبار هر تور نشون داده بشه اومدم جدول تورها رو با جدول عکس left outer join کردم و روی فیلد id_tour این join رو انجام دادم
    اما حالا دو تا مشکل دارم
    اولیش اینکه: برای تورهایی که عکسی ندارن id_tour مقداری نداره
    دوم این که می خوام هر تور فقط بکیار نشون داده بشه اما این مسئله رو نمی دونم چه جور حل کنم چون distinct فقط سطرهایی رو حذف می کنه که کل فیلد های اونها تکراری هستند از طرفی وقتی distinct هم می زارم باز هم error میده

    می دونم که این مسئله رو می شه بدون join هم حل کرد اما من می خوام حتما با join بنویسم

  2. #2
    پروفشنال MATRIX reloaded's Avatar
    تاريخ عضويت
    Feb 2007
    محل سكونت
    فعلا تو http://www.elmik.ir
    پست ها
    648

    پيش فرض

    این مشکل رو من هم داشتم. امیدوارم کسی راه حلی داشته باشه

  3. #3
    کاربر فعال انجمن موسیقی David.Jn's Avatar
    تاريخ عضويت
    Jul 2007
    پست ها
    2,070

    پيش فرض

    در مورد مشکل اولتون نباید هم مقدار داشته باشه چون وقتی اونطرف برای این id عکسی وجود نداره انتظار دارید عکس چی نمایش بده و باید هم NULL نشون بده.
    ولی اگر میخواهید توری که عکس ندارد رو نمایش ندهید میتونید از کوئری زیر در ادامه کوئریتون استفاده کنید
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    و اصلآ میتونید جای تیبل چپ و راستی رو عوض کنید که اونوقت حتی به این کوئری که بالا گفتم هم نیاز ندارین.

    مشکل دومتون شاید راهی وجود دشته باشه ولی چون تو join کردن میگیم که ردیفهایی رو برام بیار که تو اونیکی تیبل فیلد فلانش با این شبیه باشه
    پس اونم میاد به ازای هر شباهت چک میکنه و نمایش میده
    واگر هم بشه ردیفهای این یکی رو محدود کرد به یدونه نمایش دادن فیلدهای تکراریش NULL میشه.

    ولی باز نمیدونم شاید راهی وجود داشه باشه.
    ----------------------------------------------------

    راستی چرا left outer join میزنید چرا از خود left join استفاده نمیکنین؟!چون کار جفتشون مثل همه.
    واینکه اونجوری که من از ساختار جداولتون فهمیدم شما میتونین با یه natural join هم دخلشو بیارین.
    --------------------------------------------------
    باز میگم کاش یه بخش واسه پایگاه داده داشتیم(خطاب به بچز مدیر)

  4. #4
    اگه نباشه جاش خالی می مونه nibble's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    USA Boston MA
    پست ها
    477

    پيش فرض

    خوب فکر کنم من مظورم رو بد گفتم ببنید جدول ها به شکل زیر هست:
    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 مقدار نداره

    فکر کنم الان واضح تر گفته باشم

  5. #5
    کاربر فعال انجمن موسیقی David.Jn's Avatar
    تاريخ عضويت
    Jul 2007
    پست ها
    2,070

    پيش فرض

    بزارید قذم به قدم بریم جلو
    ببینید NATURAL JOIN هم میتونه به شما کمک کنه ولی مثل اینکه شما به ردیفهایی که عکس ندارن هم نیاز دارین پس باید با همون LEFT JOIN کارتون رو پیش ببرین.
    حالا شما اومدین دوباره تو توضیحاتتون میگین:
    از طرفی من وقتی left join انجام می دم توری که عکس هم نداره نشون داده می شه فقط مشکلش اینه که id_tour مقدار نداره
    خوب شما وقتی دارین بر حسب id_tour چک میکنید اون میاد این فیلد رو چک میکنه و وقتی رکورد مشترک پیدا نمیکنه مجبوره که NULL بده.
    یعنی برای اون id_tour ای که تو جدول tour دارین مفداری همانندش تو جدول img گیر نیاوارده.
    اگه مبخواین نتیجتون فقط یکی باشه اونوفت عکس هم باید یدونه نمایش بدین
    مثلآ میتویند با GROUP BY فیلدهای تکراری روی که تو جدول tour بوجود آمده رو گروه بندی کنید که اونوقت منجر میشه که یه عکس فقط نمایش داده بشه ولی از تکرار شدن جلوگیری میکنه

  6. #6
    اگه نباشه جاش خالی می مونه nibble's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    USA Boston MA
    پست ها
    477

    پيش فرض

    خوب تصور من اینه که (یعنی تا حالا همش بهمون اینجوری گفتن)
    با توجه به اینکه left join انجام می دیم و جدول tour در سمت چپ join قرار دارد برای سطرهایی هم که مقدار متناظری در جدول image وجود نداره باید id_tour از جدول tour در نتیجه قرار بگیره
    این چیزیه که من یاد گرفتم که البته نمی دونم درسته یا نه چون الان این مسئله اتفاق نمی افتد

    مشکل چند تا عکس برای یه تور هم همون جور که گفتید با group حل می شه
    ولی مشکل اول هنوز باقیه

  7. #7
    کاربر فعال انجمن موسیقی David.Jn's Avatar
    تاريخ عضويت
    Jul 2007
    پست ها
    2,070

    پيش فرض

    با توجه به اینکه left join انجام می دیم و جدول tour در سمت چپ join قرار دارد برای سطرهایی هم که مقدار متناظری در جدول image وجود نداره باید id_tour از جدول tour در نتیجه قرار بگیره
    این چیزیه که من یاد گرفتم که البته نمی دونم درسته یا نه چون الان این مسئله اتفاق نمی افتد
    تصورتون و چیزی که یاد گرفتین کاملآ درسته ولی شما یکم منظورتون رو بد رسوندید.
    من فکر میکردم شما تو جدول سمت راستی برای id_tour مقداری ندارین یعنی اونجا NULL نشون میده.
    ولی اینجوری که میگین تو سمت چپی چیزی نشون داده نمیشه!
    اگه کوئریتون رو درست نوشته باشین باید اون رکوردهای اون id رو تو جدول چپی نشون بده ولی تو سمت راستی NULL بده . مگر اینکه شما از دستور زیر استفاده کرده باشین!
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

  8. #8
    آخر فروم باز
    تاريخ عضويت
    Aug 2008
    محل سكونت
    Tehran
    پست ها
    2,419

    پيش فرض

    مگه رابطه بین این دو جدول یک به چند نیست پس وقتی Left Join میکنی باید id_tour باقی بمونه، اگر تو جدول images نباشه id_image و بقیه مقادیرش باید Null بشه. شما یجا داری اشتباه میکنی، شاید روی id_tour جدول images داری select میزنی.

  9. #9
    اگه نباشه جاش خالی می مونه nibble's Avatar
    تاريخ عضويت
    Sep 2007
    محل سكونت
    USA Boston MA
    پست ها
    477

    پيش فرض

    نه از این بابت مطمئنم
    ولی با اینحال روی چند تا جدول ساده این عمل رو انجام دادم به این نتیجه رسیدم که وقتی left join انجام می دیم مقداری که روش join انجام می دیم در صورتی که در اون یکی جدول نباشه null می گیره تنها ره حلش هم اینه که اون فیلدی که روش join انجام می دید رو براشون در دو تا جدول دو تا اسم متفاوت بزارید حل مشه
    این حاصل کار امروز من بوده حالا نمی دونم چقدر درسته؟

  10. #10
    کاربر فعال انجمن موسیقی David.Jn's Avatar
    تاريخ عضويت
    Jul 2007
    پست ها
    2,070

    پيش فرض

    نه از این بابت مطمئنم
    ولی با اینحال روی چند تا جدول ساده این عمل رو انجام دادم به این نتیجه رسیدم که وقتی left join انجام می دیم مقداری که روش join انجام می دیم در صورتی که در اون یکی جدول نباشه null می گیره
    واقعآ خسته نباشید این اون چیزیه که من تو هر سه تا پستم داشتم میگفتم!

    تنها ره حلش هم اینه که اون فیلدی که روش join انجام می دید رو براشون در دو تا جدول دو تا اسم متفاوت بزارید حل مشه
    این حاصل کار امروز من بوده حالا نمی دونم چقدر درسته؟
    چه ربطی به اسم فیلدها داره اصل محتوای داخل فیلدهاست نه اسمشون
    این محتواست که تو join کردن میاد مچ میشه.
    موقع طراحی تیبل ها میایم یک یا چند تا فیلد رو همنام میدیم چون مقادیرشون مشترکه و با هم دیگه ارتباط دارن. همین

صفحه 1 از 2 12 آخرآخر

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •