目前我們使用三個嵌套的foreach循環來獲取運行批處理的信息。不過,我相當肯定我們可以通過帶有聯接和子查詢的單個MySQL語句獲取信息。批處理作業跟蹤通知
我們有大約30個類別,2000用戶。我們的目標是100個用戶,大約100個類別,但顯然這些foreach循環並不理想(即使現在它們只需要一分鐘左右的時間)。
境遇: 用戶希望是否有可用的人,他們在某方面做貿易工作的通知
目標: 批量處理(每天,每週等)將通知把發件箱中
技術: PHP,MySQL的
我迄今爲止:
數據庫:
"table.notification_options" : [id][user_id][category]
"table.user" : [id][user_id][method_of_contact][contact_frequency][center_of_work_area_long][center_of_work_area_lat][distance_from_center]
"table.work" : [id][post_date][longitude][latitude][category]
代碼:
foreach user{
foreach category tracked{
foreach job in category posted <> $current_date-$batch_frequency{
if job inside workspace{
notify_user(job);
}
}
}
}
期望的結果是job_ids的陣列與USER_ID數組作爲鍵 [user_id] => {jobs}
例如
{
[user1]{
job1,
job4,
job28
},
[user34]{
job3,
job4,
job34,
job78
}
{
編輯:
我找到了更有效的一點,我可以選擇的所有作業的一個用戶。但它仍然需要一個foreach用戶。
$category_id = get_category_from_notification_options($userid);
$user_distance = get_user_work_distance($userid);
"SELECT DISTINCT work.ID as workID, (6371 * acos(cos(radians(-46.409939)) * cos(radians(jobs.lat)) * cos(radians(jobs.lng) - radians(168.366180)) + sin(radians(-46.409939)) * sin(radians(jobs.lat))))
AS distance
FROM work,user
WHERE work.categoryID == $category_id
HAVING distance < $user_distance
ORDER BY distance";
目標:將批處理(每日,每週等)通知放入發件箱 - ??? 發件箱? – Karma 2013-03-18 04:48:08
對不起,我不明白你的問題。澄清:用戶跟蹤他們指定的區域(他們所在位置的半徑)的工作是否可用。該腳本的工作是以特定的時間間隔運行,並收集自上次運行併發出通知後所有發佈在其區域中的作業信息。發件箱是消息發送給用戶的發送隊列 - 就像所有的電子郵件/ txt等作品一樣。 – 2013-03-18 11:11:19
我建議的SQL將在幾乎一個SQL語句中執行此操作,只需在php – Kickstart 2013-03-25 10:41:25