PDA

View Full Version : شرط تو در تو برای where در SQL



mtahmasebi
پنج شنبه 01 تیر 1391, 14:48 عصر
سلام

کسی میدونه چطور میشه یک کوئری گرفت که در اون
ابتدا شرط اول بررسی بشه ، سپس توی رکوردهایی که شرط اول در اون ها برقراره ، شرط دوم بررسی بشه و رکوردهای مورد نظر استخراج بشن!

مثلا: یه جدول داریم با 2فیلد ، در فیلد اول نام افراد و در فیلد دوم نمره اونها وجود داره.
می خوام برای هر فرد خاص کمترین یا بیشترین نمره اون فرد رو استخراج کنم.
با where به راحتی نمیشه اینکاروکرد ... :لبخندساده::لبخندساده:

maktoom
پنج شنبه 01 تیر 1391, 22:47 عصر
سلام
با where براحتی میشه اینکارو کرد.:لبخندساده:
شما باید در سلکت اول چیزی که در نهایت قراره در ResultTable نمایش داده بشه رو انتخاب کنید.
بعد میتونید id اون رو بوسیله where از یه سلکت دیگه بگیرید که اون سلکت چون باید از نوع شرطتون باشه پس اونم باید id رو از جدول دیگه با هر شرطی که شما بخواید انتخاب کنه.
یا کلا می تونید با join ها کارتون رو فوق العاده ساده تر کنید.
اگر سوالتون رو درست متوجه نشدم واضحتر بفرمایید.

در این مثال خاص که فرمودید میشه اول بر اساس نمره مثلا بصورت نزولی مرتب کرد بعد first اون رو سلکت کرد.

mtahmasebi
پنج شنبه 01 تیر 1391, 23:41 عصر
سلام
با where براحتی میشه اینکارو کرد.:لبخندساده:
شما باید در سلکت اول چیزی که در نهایت قراره در ResultTable نمایش داده بشه رو انتخاب کنید.
بعد میتونید id اون رو بوسیله where از یه سلکت دیگه بگیرید که اون سلکت چون باید از نوع شرطتون باشه پس اونم باید id رو از جدول دیگه با هر شرطی که شما بخواید انتخاب کنه.
یا کلا می تونید با join ها کارتون رو فوق العاده ساده تر کنید.
اگر سوالتون رو درست متوجه نشدم واضحتر بفرمایید.

در این مثال خاص که فرمودید میشه اول بر اساس نمره مثلا بصورت نزولی مرتب کرد بعد first اون رو سلکت کرد.




اطلاعات توی یه جدول هستن نه دو جدول که بشه از join استفاده کرد. اگر میشه درمورد مثالی که عرض کردم پاسخی بدید.ممنون.

aslan
جمعه 02 تیر 1391, 01:21 صبح
SELECT name, MIN(Nomre) AS Expr1, MAX(Nomre) AS Expr2
FROM Test
GROUP BY name

mtahmasebi
جمعه 02 تیر 1391, 10:47 صبح
SELECT name, MIN(Nomre) AS Expr1, MAX(Nomre) AS Expr2
FROM Test
GROUP BY name




ممنون :تشویق:
کوئری با نمکی بود!:بامزه:
البته من می خواستم کوئری فقط اطلاعات یک شخص خاص رو برگردونه!
برای این کار باید:




SELECT name, MIN(no) AS Expr1
FROM school2
where name = 'ali'
GROUP BY name



و اگه بخوایم فیلدهای دیگه رکورد رو هم واکشی کنیم باید:





SELECT name, family , class, MIN(no) AS Expr1
FROM school2
where name = 'ali'
GROUP BY name , family , class




البته درمورد کد دوم تو بعضی شرایط بیش از یه رکورد بر می گرده و نتیجه درست نمیده! :عصبانی++:


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

maktoom
جمعه 02 تیر 1391, 13:33 عصر
اولا اطلاعات توی یه جدول هستن نه دو جدول که بشه از join استفاده کرد.
بنظرم بهتره کمی روی دیتا بیس مربوط به شجره نامه فکر کنید. که البته فقط یک جدول داره. و باید به کوئری های تعداد پسرعموهای فرد خاص و یا تعداد فرزندان نامادری خاصی رو پیدا کرد.

ضمنا فکر کنم بهتر باشه به اون مثالی که زدم پاسخ بدید

کوئری با نمکی بود!
؟؟؟

(از کسی طلبی دارید؟ دوستان وظیفشونه زود به زود بیان به مشکلات شما پاسخ بدن؟ شما هنوز نمی دونید که میشه یه جدول رو با خودش join کرد یا select تودرتو زد اونوقت باید به دیگران پوزخند بزنید؟)

maktoom
جمعه 02 تیر 1391, 14:01 عصر
پاسخ برای حالت یک جدول:
select MIN(Mark) from StNum where Sname='ali' ORDER BY Mark
پاسخ برای حالت ذخیره در 2 جدول جداگانه(حداقل استاندارد طراحی):
select MIN(Mark) from mark where sid in(select id from student where Sname='ali') ORDER BY Mark;
به جمله آخر کامنت قبلیم ORDER BY رو هم اضافه کنید.

اما بازهم اگر نکته مبهمی هست بفرمایید. ممکنه من درست متوجه نشده باشم.

mtahmasebi
جمعه 02 تیر 1391, 18:08 عصر
بنظرم بهتره کمی روی دیتا بیس مربوط به شجره نامه فکر کنید. که البته فقط یک جدول داره. و باید به کوئری های تعداد پسرعموهای فرد خاص و یا تعداد فرزندان نامادری خاصی رو پیدا کرد.


؟؟؟

(از کسی طلبی دارید؟ دوستان وظیفشونه زود به زود بیان به مشکلات شما پاسخ بدن؟ شما هنوز نمی دونید که میشه یه جدول رو با خودش join کرد یا select تودرتو زد اونوقت باید به دیگران پوزخند بزنید؟)


دوست عزیز چرا ناراحت شدی؟ من منظورم از با نمک ، جالب بودنش بود! چون اصلا فکر نمی کردم group By توی یه کوئری همچین کاری بتونه بکنه، منظورم رو اشتباه متوجه شدید. ضمنا فکر نکنم وقتی کسی لطف کنه و جواب کسی رو بده (هرچند درست یا اشتباه) کسی به اون پوزخند بزنه.

در کل از لطف شما برای پاسخگویی کمال تشکر رو دارم

mtahmasebi
جمعه 02 تیر 1391, 19:58 عصر
با تشکر مجدد از دوستانی که در این تاپیک مشارکت کردن

از کوئری





select code , name from school2 where no = (select MIN(no) from school2 where name = 'ali')



استفاده کردم جواب داد.

همون اول کاری هم این کوئری رو استفاده کردم ، البته جای پرانتز و NO رو جابه جا نوشتم و جوب نداد . برای همین فکر کردم شاید SQL از شرط های تو در تو به راحتی پشتیبانی نکنه!


موفق باشید