ورود

View Full Version : سوال: کمک خواستن درباره یک کوئری نسبتا پیچیده



p30tec
یک شنبه 05 خرداد 1392, 15:23 عصر
سلام دوستان و اساتید
یه 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 هست با توجه به زمان

rasoul_par
یک شنبه 05 خرداد 1392, 15:55 عصر
اگر درست فهمیده باشم:

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

p30tec
یک شنبه 05 خرداد 1392, 17:03 عصر
خیلی ممنون از جوابت
اما من متوجه نشدم چیکار کردی چون هم با temp آشنایی ندارم هم فکر کنم اشتباه تایپی داره کوئری ای که نوشتید چون مثالی که گفتم با کارم فرق میکنه متوجه نشدم چی شد؟
میتونی یه جور دیگه بگی ؟ یا توضیح بدی کمی؟

p30tec
یک شنبه 05 خرداد 1392, 19:47 عصر
کمک !!!!!!!!!!!!!!!

rasoul_par
یک شنبه 05 خرداد 1392, 21:47 عصر
temp چیز خاصی نیست، اسم جدول log رو temp گذاشتم.
اون چیزی که من نوشتم اول میاد جدول log رو در خودش ضرب می کنه، بعد توی حاصلضرب میگرده دنبال رکوردهایی که log_date اونها از همه بزرگتره و استاتوس اونها برابر 2 و آی دی اونها برابره، بعد با جدول پست ضرب میکنه حاصل رو و پست رو با آخرین تاریخ log_date میاره.
پ.ن: ببخشید، توی کوئری حواسم نبود آی دی ها رو چک نکردم.:خجالت:

p30tec
یک شنبه 05 خرداد 1392, 22:26 عصر
:لبخندساده: ممنون لطف کردی

rasoul_par
دوشنبه 06 خرداد 1392, 01:27 صبح
درست شد؟:افسرده:

p30tec
دوشنبه 06 خرداد 1392, 09:07 صبح
آره ممنون یه جور دیگه کوئری و نوشتم حل شد فقط چون دارم از Yii استفاده میکنم و توی Named Scope باید بکار ببرم خود Query بکارم نمیاد نمیدونم چطوری تبدیلش کنم به CDbCriteria

p30tec
دوشنبه 06 خرداد 1392, 09:16 صبح
لطف میکنی اینو ببینی 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`

p30tec
سه شنبه 07 خرداد 1392, 12:46 عصر
مشکل رو به نحوی حل کردم
ممنون از rasoul_par

rasoul_par
چهارشنبه 08 خرداد 1392, 09:56 صبح
عذر خواهی میکنم بابت تاخیر، من خودم یه بخشایی از داکیومنت Yii رو ترجمه کردم هرچند خیلی قوی نیست و مال وقتیه که داشتم یاد میگرفتم. میتونی از بخش Yii همین فروم دانلودش کنی!