現時点では、ネストされた 3 つの foreach ループを使用して、バッチを実行するための情報を取得しています。ただし、結合とサブクエリを使用した単一の MySQL ステートメントで情報を取得できると確信しています。
2000 人のユーザーを持つ約 30 のカテゴリがあります。私たちの目標は、100000 人のユーザーを持つ約 100 のカテゴリですが、明らかに foreach ループは理想的ではありません (現在でも実行に約 1 分かかります)。
状況: ユーザーは、特定の領域で行うことができる取引に利用可能な仕事がある場合に通知を受け取りたいと考えています。
目標: バッチ プロセス (毎日、毎週など) の通知を送信トレイに入れる
テクノロジー: 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);
}
}
}
}
望ましい結果は、キーとして user_id を持つ job_id の配列の配列です [user_id]=>{jobs}
例えば
{
[user1]{
job1,
job4,
job28
},
[user34]{
job3,
job4,
job34,
job78
}
{
編集:
1 人のユーザーのすべてのジョブを選択できるので、もう少し効率的です。ただし、それでも 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";