نمایش نتایج 1 تا 11 از 11

نام تاپیک: درخواست یک Query

  1. #1

    Question درخواست یک Query

    با عرض سلام خدمت اساتید گرامی

    من برنامه ای دارم که درونش یک جدول وجود داره که ساعت های برگزاری یک سری کلاس رو نگه می داره . بعضی از کلاس ها که بیشتر از یک جلسه دارن ، براشون 2 تا رکورد ذخیره می کنه که یک فیلد مشترک به نام id دارن
    یکی از فیلدهای این جدول هم ساعت امتحان اون درس هست . حالا برنامه من میاد و تمامی رکورد هایی که ساعت امتحانشون یکیه رو از جدول می خونه و به عنوان تداخل ساعت امتحانی نشون میده
    حالا مشکل من اینجاست که اون کلاسی که دو تا رکورد براش ذخیره شده رو هم در این عمل شرکت میده ، یعنی میگه که این 2 تا رکورد باهم تداخل ساعت امتحانی دارن در صورتی که این 2 رکورد برای یک کلاس هست و نباید در این پرس و جو دخالت داده بشه . من می خوام که این عمل مقایسه ساعت های امتحانی رو برای اون رکورد هایی که id اونها یکسان هست رو در نظر نگیره و انجام نده

    راهی که الان رفتم اینه که میام و select distinct بر اساس id میگیریم و یک view می سازم
    سپس پرس و جو تداخل ها رو روی اون view اعمال می کنم . اما یکمی سرعت اجرا کنده و ضمن اینکه فکر هم نمی کنم زیاد جالب باشه و میدونم که حتما یک راه حل داره

    چندجا هم گفتند که از self join استفاده کن که اونم نتونستم جواب بگیرم

    دوستان اگر می تونند لطفا کمک کنند
    ممنون

  2. #2

    نقل قول: درخواست یک Query

    اولا که تا جایکه من می دونم فقط distinct برای تکراری ها است.
    در ضمن چرا دوتا رکورد شما می تونی یک فیلد بزاری برای تعداد جلسه ها
    این فیلد میتونه int باشه اگر 1 باشه یعنی یک جلسه اگر 2 باشه یعنی 2 جلسه و ...

  3. #3

    نقل قول: درخواست یک Query

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

  4. #4
    کاربر دائمی
    تاریخ عضویت
    آذر 1385
    محل زندگی
    اراک
    پست
    230

    نقل قول: درخواست یک Query

    فکر کنم راه حل درست همون select distinct می باشد و لی یک مشکلی که داری خواص دو نوع موجودیت مختلف رو در یک جدول آوردی یعنی امتحان که از خواص پایه یک درس است بهتر در کنار خواص اصلی یک درس قرار بگیرد پیشنهاد می کنم جهت برگزاری کلاسها و نگهداری زمان آنها یک جدول جدا و جهت زمان امتحان دروس حالابا خواص دیگه یک جدول جداگانه داشته باشی این مورد از مباحث نرمال سازی پایگاه داده است اگر یکم وقت بگذاری راهکارهای بهتری برای اینجور کارها با این مبحث پیدا می کنی من خودم وقتی با این موضوع اشنا شدم نحوه ساختارهای دیتابیس هام کلی تغییر کرد
    انشاءالله که بدردت خورده باشد

  5. #5
    کاربر دائمی
    تاریخ عضویت
    آذر 1385
    محل زندگی
    همین نزدیکیها
    پست
    683

    نقل قول: درخواست یک Query

    مشکلت سر distinct و ... نیست
    یه Join زدی که اون Join داره ضربدری کار میکنه
    لطفا کدی که نوشتی بزار ببینیم Joinet چطوریه وگر نه بایک select اینجوری نمیشه

  6. #6

    نقل قول: درخواست یک Query

    طراحی این بانک کار خودم نبوده و پروژه نصفه به من تحویل داده شده . به قول دوستم جدولم نرمال نیست . اما پروژه خیلی بزرگه و فعلا تغییرات ساختاری امکان پذیر نیست

    ببینید اسم جدولم provided هست و این فیلد ها رو داره :
    id : که کلید کلاس مورد نظر هست
    classday : روز کلاس
    classtime : ساعت کلاس
    testday : روز امتحان
    testtime : ساعت امتحان

    این فیلد ها برای هر کلاس ذخیره میشه و کلاس هایی که دو جلسه ای هستند 2 رکورد براشون ذخیره میشه که id آنها یکسان هست که مشخص میشه یک کلاس هستند و فقط ساعت و روز کلاسش با هم فرق می کنه و فیلدهای روز و ساعت امتحان هم در هر دو رکورد یکسانه (که به قول دوست خوبم amir باید نرمال بشه و از این جدول جدا بشه) . حالا پرس و جو من به این شکل هست :

    select id from provided where testday=1 and testtime=1


    این پرس و جو میاد و تعداد کلاس هایی که امتحان آنها روز اول و ساعت آن هم ساعت اول هست رو پیدا می کنه و به عنوان کلاس هایی که ساعت امتحانشون تداخل داره اعلام می کنه
    از اونجایی که کلاس هایی که دو جلسه ای هستند ، دو رکورد براشون ذخیره میشه که testday و testtime اونها یکی هست . اون هم به عنوان تداخل اعلام میشه . یعنی میگه این کلاس با خودش تداخل داره که اشتباهه
    کاری که من کردم یک view ساختم به این شکل :

    Create View tmp As Select distinct id,testday,testtime from provided


    و اون select بالا رو روی این view اعمال کردم . به این شکل برای هر کلاس فقط یک نمونه رکوردش رو داریم و این مشکل حل میشه که یکمی کند و زشته
    حالا راه حل شما واسه این مشکل چیه ؟ چطوری رو همون select اول بگیم که id های یکسان رو به عنوان تداخل در نظر نگیره ؟

  7. #7
    کاربر دائمی
    تاریخ عضویت
    آذر 1385
    محل زندگی
    همین نزدیکیها
    پست
    683

    نقل قول: درخواست یک Query

    خوب روز کلاس رو هم توی شرطت بیاری درست میشه
    مثلا روز کلاس 1 و روز امتحان 1 و ساعت 1

    یا اینکه یک فیلد اضافه کنی برای جلسه که 1و2 توش ذخیره بشه بعد توی شرط بگی جلسه هم 1 باشه

  8. #8

    نقل قول: درخواست یک Query

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

  9. #9
    کاربر دائمی
    تاریخ عضویت
    خرداد 1388
    محل زندگی
    تهران
    سن
    38
    پست
    1,104

    نقل قول: درخواست یک Query

    یه سوالی؟ چرا این کوئری کاری که میخوای رو انجام نمیده واستون؟
    select distinct (id) from provided where testday=1 and testtime=1

    lمگه شما نمیخواین بدونین کدوم کلاسا روز و ساعت امتحانشون یکیه؟ خوب این کوئری که همینو میگه..!

  10. #10

    نقل قول: درخواست یک Query

    ای بابا ، این همه توضیح دادم . یکمی توضیحاتو بخونید متوجه میشید

  11. #11
    کاربر دائمی
    تاریخ عضویت
    آذر 1385
    محل زندگی
    همین نزدیکیها
    پست
    683

    نقل قول: درخواست یک Query

    دوست عزیز
    یک زحمت دیگه بکش اگه میخوای نتیجه بگیری خروجی یک دستور select از اون جدول رو بزار ببینیم با همه فیلد ها و بدون فیلتر و ....

قوانین ایجاد تاپیک در تالار

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