سلام
من 2 تا تیبل دارم فرض کنید به این فرمت
Main_Table
ID
DayID
text
و
Day_Table
ID
DAY
PRICE
می خوام از تیبل اول text ها یی رو پیدا کنم که معادل اونها DAY برابر 12 باشه مثلا و PRICE بزرگتر از یک و یا اصلا رکوردی با DAY=12 وجود نداشته باشه رو بر گردونه
Main_Table
- 1,1,test
- 2,2,test2
Day_Table
- 1,12,2
در واقع باید test و test2 انتخاب بشه امید وارم درست توضیح داده باشم
اینم یه sql که اشتباه چون دومی رو بر نمی گردونه
کد:
SELECT m.text FROM `Main_Table` as m join Day_Table as d on m.DayID=d.ID WHERE (d.`DAY`=12 AND d.PRICE > 1) or ????
سلام
رابطه بین این دو جدول در واقع فیلد ID هست و شرط join شدن دو جدول بر این اساس هست که m.DayID=d.ID .
شما در جدول دوم یا همون Day_Table یک رکورد دارید و اونهم دارای ID برابر با 2 هست . در جدول اول هم یک رکورد با شرط فوق وجود داره پس در نتیجه query که شما نوشتی باید یک جواب برگردونه !
در واقع شما یک inner join انجام دادی و در نتیجه باید همون جواب رو هم میگرفتی اما به نظر میاد اگر به جای یک join معمولی از left join استفاده کنی نتیجه دلخواهت رو میگیری :
کد:
SELECT m.text FROM `Main_Table` as m left join Day_Table as d on m.DayID=d.ID WHERE (d.`DAY`=12 AND d.PRICE > 1) or ????
سلام
و ممنون
سیستم پیچیده تر از این حرف هاست :d
این نباید یک جواب برگردونه من دومی رو هم می خوام
من می خوام اگه d.`DAY`=12 وجود نداشت شرط قیمت رو چک نکنه یعنی text2 هم جواب هست چون اصلا رکوردی معادل تو جدول نداره مشکل من اینجاست که این day هر روز عوض می شه و مثلا ممکنه ظهر یه قیمت بهش بدم و تا ندادم پس صفر باید درنظر گرفته بشه مثلا من کسایی رو می خوام که امروز کمتر از 1000 تومان خرید کردن اگه خرید کرده باشن که حل ولی اگه خرید نکرده باشن این کویری هیچی بر نمی کردونه البته ممکنه این افراد دیروز 2000 تومان هم خرید کرده باشن که مهم نیست ولی امروز هیچ خریدی نکردن
یه راه اینه که اولین ثانیه امروز برای همه یه خرید صفر ثبت کنم ولی کار عاقلانه ای نیست
فکر کنم ممد جان فقط کار خودته حلش کنی
پس چی شد کسی بلد نبود؟ :(
هادی جان یک روزی نبودم . سعی میکنم براش یه راه پیدا کنم
من query زیر رو تست کردم و جواب داد :
کد:
SELECT text FROM Main_Table WHERE DayID NOT IN ( SELECT ID FROM Day_Table WHERE DAY=12 and PRICE<=1);
سلام دستت درد نکنه
مشکل حل می شه با این ولی یه سوال دیگه
مثلا توی یه جدول 10000 تایی روزی حداقل 100000 بار اجرا یکم فشار ایجاد نمی کنه؟ (البته با فرض ایندکس گذاری)
اگه اینو به همون روش join می شد نوشت فشار کمتری ایجاد می کرد تا این روش 2 select ؟
البته توی فکرم جواب هارو کش کنم و از توی کش دوباره سلکت بزنم تا شرط ها کمتر بشن (تعدادشون بیشتر از چیزیه که الان می بینی)
کلا روش دیگه ای به جز کش برای این پیش نهاد می کنی؟
تا اونجا که بررسی کردم شاید کلا نشه این query رو با join نوشت چون پیدا کردن یه رابطه منطقی با کمک فیلد ID بین دو جدول امکان پذیر نبود .
من میتونم بهت اینو پیشنهاد کنم که اگر میتونی select دوم رو به شکل یک view تعریف کنی . این باعث میشه که دیتابیس نخواد هر دفعه اونو Re-Parse کنه و سرعت بالا تر میره .
کد:
mysql> CREATE VIEW v AS SELECT ID FROM Day_Table WHERE DAY=12 and PRICE<=1;
حالا میشه اینطوری query رو دوباره نوشت :
کد:
SELECT text FROM Main_Table WHERE DayID NOT IN v;
روش Cache کردن هم بد نیست ولی خوب در کل فکر نکنم بیشتر از این query رو بشه کارا کرد .
ممنون لطف کردی فکر نمی کردم اصلا قابل حل باشه
قربانت