PDA

View Full Version : کمک در نوشتن Query



$ M 3 H R D A D $
شنبه 15 تیر 1392, 21:23 عصر
سلام
من جدول کاربران دارم که توش تاریخ expire شدن عضویتشون قید شده و همچنین سایر مشخصات مثل شماره همراه و ایمیل

جدول دیگه ای دارم به نام گروه بندی که توش آیدی منحصر به فرد هست

جدول دیگه دارم به نام پیامک ها که توش قید میشه این پیامک از کدوم دسته بندی هست (category_id)


جدول آخر هم اسمش log هست

جداول و اکسپورت کردم در پست قرار دادم :

حالا میخوام cron job من یک query به بانک بده و لیست کل کاربران که هنوز expire نشدند را به همراه یک پیامک که قبلا براشون ارسال نشده ( با توجه به نبود اون پیام در جدول log ) و اونم از یک گروه بندی تصادفی انتخاب کنه ( خود پیام هم تصادفی انتخاب بشه )


مشکلات موجود :
یک سری پیامک لیست میشند که قبلا برای کاربر خاص ما ارسال نشده اما دسته بندی که به صورت تصادفی انتخاب میشه با دسته بندی پیامک های پیدا شده برابر نیست و null میده که اینجا و باید مدیریت کنیم که یا دوباره بده یا یک روش دیگه

مشکل بعد اینه که یک موقع برای یک کاربر همه پیامک ها ارسال میشه اون موقع باید بیاد از جدولlog قدیمی ترین پیامک ها و لیست کنه و از بین اونا دوباره ارسال کنه یا اینکه گذارشی و جا ای ثبت کنه که پیامک ها تموم شدند

من هرچی کد نوشتم نتیجه نداد خیلی جا ها مشل داشتم
لطفا راهنمایی کنید

اینم از کد ها که اکثرا با مشکل هستند :

SELECT * , (SELECT id FROM `category` WHERE 1 ORDER BY rand() LIMIT 0 , 1) AS 'cat_each', ( SELECT id FROM `sms`
WHERE (category_id = cat_each) and id not in(select sms_id from log where user_id=users_info.id and 'sms_id' is not null) ORDER BY rand( ) LIMIT 0 , 1)
AS 'sms_id' FROM users_info

SELECT text from sms WHERE id not in (select sms_id FROM log where user_id=users_info.id)


select *,(SELECT 'text' from sms WHERE id not in (select sms_id FROM log where user_id=users_info.id)) from users_info
and )

select text from sms inner join log on sms.id = log.sms_id



SELECT * FROM `sms` WHERE `id` NOT IN ( SELECT `sms_id` FROM `log` WHERE `user_id`=37 )

rezaonline.net
یک شنبه 16 تیر 1392, 00:05 صبح
یه مثال عملی بزن ، مثلا کاربر شناسه فلان ، فلان چیز رو در بیاره
اینجور هم که مشخصه کمی روی ساختار پیاده سازی ، زیادی پیچیده اش کردی .
گاها روابطی که بین دو تا جدول از نوع یک به یک موجود هست رو روی یک جدول با اضافه کردن فیلد جدول دوم پیاده کن اگر تعداد فیلدهات زیاد نیست ، رکوردهایی هم که لازم نیستن توی این رابطه درگیر باشن null در نظر بگیر .
بذار کمی تعداد تیبلهات کمتر بشه .

$ M 3 H R D A D $
یک شنبه 16 تیر 1392, 01:09 صبح
کاربر فلان نمیخوام ! به تعداد کاربران باید رکورد برگردونه
برای کاربر خاص داده نماگیرم
SELECT * , (
یعنی کل اطلاعات جدول یوزر و به همراه اون یک متن پیام که به روش گفته شده تولید میشه

shpegah
یک شنبه 16 تیر 1392, 11:17 صبح
سلام
کاش جدول log شما دیتا داشت که بهتر بشه تست کرد چون category_idداری دیگه نیاز به انتخاب از جدول کتگوری نداری
اینوامتحان کن فک نکنم مشکلی داشته باشه

select sms.id,text,category_id,newQuery.*
from sms,
(SELECT *,
( SELECT id FROM sms
WHERE id not in(select sms_id from log where user_id=users_info.id ) ORDER BY rand( ) LIMIT 0 , 1) AS xxx
FROM users_info ) as newQuery
where sms.id=xxx

$ M 3 H R D A D $
یک شنبه 16 تیر 1392, 12:14 عصر
سلام
کاش جدول log شما دیتا داشت که بهتر بشه تست کرد چون category_idداری دیگه نیاز به انتخاب از جدول کتگوری نداری
اینوامتحان کن فک نکنم مشکلی داشته باشه

select sms.id,text,category_id,newQuery.*
from sms,
(SELECT *,
( SELECT id FROM sms
WHERE id not in(select sms_id from log where user_id=users_info.id ) ORDER BY rand( ) LIMIT 0 , 1) AS xxx
FROM users_info ) as newQuery
where sms.id=xxx
میشه در مورد کدتون توضیح بدید
و بگید چجوری اینقدر راحت تحلیل کردین
و همه اون شروط من و پوشش داده ؟ اشکالا کد و هم بگید
چون خودشو نفهمیدم نمیتونم مشکلاتشو بفهمم

shpegah
یک شنبه 16 تیر 1392, 12:45 عصر
من که کار خاصی نکردم که نفهمید کد خود شما روبرداشتم منتها کتگوری روحذف کردم چون id اون توی جدول sms هست وهمونطور که خودتون از جدول sms کدهای log رو حذف کردید منتها یک اشکال داشت که null ها رو استثنا کرده بودید که نباید میکردید بعد وصلش کردم به user-info ودر آخر همه فیلدهای مورد نظر رو نمایش دادم

$ M 3 H R D A D $
یک شنبه 16 تیر 1392, 13:05 عصر
نه اشتباه میکنید
من تو log آیدی کاربر و آیدی پیامک و دارم نه کتگوری...
یعنی فلان یوزر براش فلان پیغام رفته

shpegah
یک شنبه 16 تیر 1392, 13:09 عصر
من گفتم توی sms دارید نه توی log باارتباطی که داریم نیازی نیست توی log داشته باشیم

shpegah
یک شنبه 16 تیر 1392, 13:11 عصر
شما این کد را بادیتای واقعی تست کردید؟ نتیجه چه بود؟ بااین دیتا 30 رکورد داد که فکر نکنم اشتباه باشه

$ M 3 H R D A D $
یک شنبه 16 تیر 1392, 13:13 عصر
ممنون از لطفتون
من روش کار میکنم اگه مشکلی نباشه باز مزاحمتون میشم

$ M 3 H R D A D $
دوشنبه 17 تیر 1392, 02:10 صبح
شما این کد را بادیتای واقعی تست کردید؟ نتیجه چه بود؟ بااین دیتا 30 رکورد داد که فکر نکنم اشتباه باشه

با همین داده موجود تست کردم
32 تا sms و برای هر یوزر تو لاگ ثبت میکرد خداروشکر
یکم دیگه روش مار داره
شروط اینکه اگه پیام ها تموم بشند باید بیاد دوباره از اونا که قبلا ارسال کرده هم ارسال کنه
شرط اعتبار داشتند اکانتش

shpegah
دوشنبه 17 تیر 1392, 08:09 صبح
ببخشید من با ادبیات شما آشنانیستم درست منظورتان را نمیفهمم
اگر اشتباه نکنم بخش اول درست بوده وقراره دوتاشرط دیگه اضافه کنید اولی اینکه اگرپیام ارسال نشده ای موجود نبود از همان قبلیها استفاده کند ودومین شرط ؟
شما توی این 4 تا تیبل که فرستادید اصلا اکانتی نداشتید میشه بگید کدام فیلدها در کدام تیبل اکانت را مشخص میکند؟شرط اعتبار چیست؟

$ M 3 H R D A D $
دوشنبه 17 تیر 1392, 19:10 عصر
بله باید شرط و همونطور که گفتین کامل کنیم
شما فایل ضمیمه و دریافت کنید توش اطلاعات هست تو پست اول...

shpegah
سه شنبه 18 تیر 1392, 11:09 صبح
دوست عزیز فعلا جواب شرط اول رو داشته باش تا سرفرصت برای شرط دومت جدولها رو ببینم

select sms.id,text,category_id,newQuery.*
from sms,
(SELECT *,if( (select sms_id from log
where user_id=users_info.id ) is not null
,( SELECT id FROM sms
WHERE id not in(select sms_id from log
where user_id=users_info.id )
ORDER BY rand( ) LIMIT 0 , 1
)
,(SELECT id FROM sms ORDER BY rand( ) LIMIT 0 , 1
)
) AS zzz
FROM users_info
) as newQuery
where sms.id=zzz

shpegah
سه شنبه 18 تیر 1392, 11:40 صبح
بخش شرط اکانت داشتن

select sms.id,text,category_id,newQuery.*,category.*
from sms,category,
(SELECT *,if( (select sms_id from log
where user_id=users_info.id ) is not null
,( SELECT id FROM sms
WHERE id not in(select sms_id from log
where user_id=users_info.id )
ORDER BY rand( ) LIMIT 0 , 1
)
,(SELECT id FROM sms ORDER BY rand( ) LIMIT 0 , 1
)
) AS zzz
FROM users_info
) as newQuery
where (sms.id=zzz) and (category_id=category.id) and (cat_levels='ALL')