کمک خواستن درباره یک کوئری نسبتا پیچیده
سلام دوستان و اساتید
یه MySQL Query رو هر چقدر فکر کردم نتونستم بنویسم کسی میتونه کمکی کنه
ببینید من دو تا جدول دارم به این صورت (برای اینکه ساده تر توضیح بدم جدولها رو فرضی و ساده نوشتم)
جدول اول Post
ID
Title
Content
جدول دوم Log
ID
Status
Log_Time
Post_ID
خوب ببینید هر دو جدول Storage Engine=InnoDB هست و Log.Post_ID کلید خارجی هست که به Post.ID اشاره میکنه
فرض کنید یه سری داده توی Post داریم
و داده های Log به این صورت هست که برای هر Post چندین Log وجود داره یعنی یه ارتباط 1:N و N:1 داریم
داده های فرضی برای Log به این صورت هستند (متاسفانه توی ابزارهای ایجاد تاپیک جدول نیست و مجبورم نامرتب بگم)
ID=1
Status=0
Log_Time=2013-01-01
Post_ID=1
ID=2
Status=1
Log_Time=2013-01-02
Post_ID=1
ID=3
Status=2
Log_Time=2013-01-03
Post_ID=1
ID=4
Status=0
Log_Time=2013-01-01
Post_ID=2
جدول لاگ به این صورت هست که هر وقت وضعیت پست عوض شد وضعیت جدید با زمان لاگ توش ثبت میشه
حالا چه کوئری ای میتونه این عمل رو انجام بده ؟؟
میخوام تمام پست هایی که آخرین وضعیتشون مثلا دو هست رو انتخاب کنم
آخرین وضعیت مطابق جدول لاگ و بر اساس زمان مشخصه مثلا آخرین وضعیت پست شماره یک توی داده هایی که دادم 2 هست با توجه به زمان
نقل قول: کمک خواستن درباره یک کوئری نسبتا پیچیده
اگر درست فهمیده باشم:
SELECT Post.*, loglog.log_date FROM Post, (
SELECT temp.Post_id, temp.log_date
FROM Log temp, Log temp2
WHERE
temp.status = 2 AND
temp2.status = 2 AND
temp.log_date >= temp2.log_date AND
temp.id = temp2.id
) LogLog
WHERE
Post.Id = LogLog.Post_id
نقل قول: کمک خواستن درباره یک کوئری نسبتا پیچیده
خیلی ممنون از جوابت
اما من متوجه نشدم چیکار کردی چون هم با temp آشنایی ندارم هم فکر کنم اشتباه تایپی داره کوئری ای که نوشتید چون مثالی که گفتم با کارم فرق میکنه متوجه نشدم چی شد؟
میتونی یه جور دیگه بگی ؟ یا توضیح بدی کمی؟
نقل قول: کمک خواستن درباره یک کوئری نسبتا پیچیده
نقل قول: کمک خواستن درباره یک کوئری نسبتا پیچیده
temp چیز خاصی نیست، اسم جدول log رو temp گذاشتم.
اون چیزی که من نوشتم اول میاد جدول log رو در خودش ضرب می کنه، بعد توی حاصلضرب میگرده دنبال رکوردهایی که log_date اونها از همه بزرگتره و استاتوس اونها برابر 2 و آی دی اونها برابره، بعد با جدول پست ضرب میکنه حاصل رو و پست رو با آخرین تاریخ log_date میاره.
پ.ن: ببخشید، توی کوئری حواسم نبود آی دی ها رو چک نکردم.:خجالت:
نقل قول: کمک خواستن درباره یک کوئری نسبتا پیچیده
:لبخندساده: ممنون لطف کردی
نقل قول: کمک خواستن درباره یک کوئری نسبتا پیچیده
نقل قول: کمک خواستن درباره یک کوئری نسبتا پیچیده
آره ممنون یه جور دیگه کوئری و نوشتم حل شد فقط چون دارم از Yii استفاده میکنم و توی Named Scope باید بکار ببرم خود Query بکارم نمیاد نمیدونم چطوری تبدیلش کنم به CDbCriteria
نقل قول: کمک خواستن درباره یک کوئری نسبتا پیچیده
لطف میکنی اینو ببینی http://www.yiiframework.com/doc/api/1.1/CDbCriteria
فکر نمیکنم دانش Yii بخواد (نمیدونم شاید شما استاد Yii هم باشی اتفاقی) ببین میتونیCDbCriteria معادل این کوئری رو بگی ؟؟
SELECT *
FROM (
SELECT *
FROM `tbl_log`
ORDER BY logtime DESC
) `t1`
GROUP BY `post_id`
نقل قول: کمک خواستن درباره یک کوئری نسبتا پیچیده
مشکل رو به نحوی حل کردم
ممنون از rasoul_par
نقل قول: کمک خواستن درباره یک کوئری نسبتا پیچیده
عذر خواهی میکنم بابت تاخیر، من خودم یه بخشایی از داکیومنت Yii رو ترجمه کردم هرچند خیلی قوی نیست و مال وقتیه که داشتم یاد میگرفتم. میتونی از بخش Yii همین فروم دانلودش کنی!