PDA

View Full Version : درخواست یک Query



majidrezaei2007
شنبه 08 بهمن 1390, 04:19 صبح
با عرض سلام خدمت اساتید گرامی

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

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

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

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

ahmad000012
شنبه 08 بهمن 1390, 07:39 صبح
اولا که تا جایکه من می دونم فقط distinct برای تکراری ها است.
در ضمن چرا دوتا رکورد شما می تونی یک فیلد بزاری برای تعداد جلسه ها
این فیلد میتونه int باشه اگر 1 باشه یعنی یک جلسه اگر 2 باشه یعنی 2 جلسه و ...

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

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

zarrinnegar
شنبه 08 بهمن 1390, 09:04 صبح
مشکلت سر distinct و ... نیست
یه Join زدی که اون Join داره ضربدری کار میکنه
لطفا کدی که نوشتی بزار ببینیم Joinet چطوریه وگر نه بایک select اینجوری نمیشه

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

ببینید اسم جدولم 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 های یکسان رو به عنوان تداخل در نظر نگیره ؟

zarrinnegar
شنبه 08 بهمن 1390, 14:56 عصر
خوب روز کلاس رو هم توی شرطت بیاری درست میشه
مثلا روز کلاس 1 و روز امتحان 1 و ساعت 1

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

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

shadi khanum
شنبه 08 بهمن 1390, 21:53 عصر
یه سوالی؟ چرا این کوئری کاری که میخوای رو انجام نمیده واستون؟
select distinct (id) from provided where testday=1 and testtime=1
lمگه شما نمیخواین بدونین کدوم کلاسا روز و ساعت امتحانشون یکیه؟ خوب این کوئری که همینو میگه..!

majidrezaei2007
یک شنبه 09 بهمن 1390, 00:09 صبح
ای بابا ، این همه توضیح دادم . یکمی توضیحاتو بخونید متوجه میشید

zarrinnegar
یک شنبه 09 بهمن 1390, 00:14 صبح
دوست عزیز
یک زحمت دیگه بکش اگه میخوای نتیجه بگیری خروجی یک دستور select از اون جدول رو بزار ببینیم با همه فیلد ها و بدون فیلتر و ....