3

自分が作成した求人サイトのメール通知システムを作成しようとしています。現在、候補者にメールを送信する前に、一定量の求人をグループ化することを検討しています。

私は、candidate_id、job_id、および「電子メールで送信された」ブール値を含む、candidate_to_jobと呼ばれるテーブルを持っています。

私が苦労しているのは、新しいジョブが投稿されてメールが送信されたときにそのテーブルを更新することです。これまでのところ、新しいジョブが投稿されると、次のように実行します。

SELECT     c2j.candidate_id, c2j.job_id, j.title 
FROM       " . DB_PREFIX . "candidate_to_job c2j 
LEFT JOIN  " . DB_PREFIX . "job j 
       ON  (j.job_id = c2j.job_id) 
WHERE      c2j.emailed = 0

次に、PHPを使用してそれらをすべてグループ化し、次のような配列を作成します。

$candidates = array(
    1 => array(1,2,3),
    2 => array(1,3),
    3 => array(4,5,6)
);

配列キーが候補IDであり、値がジョブIDの配列です。

その配列を使用して(電子メールが送信された後)、電子メールで送信されたcandidate_to_jobテーブル設定をtrueに更新します。たとえば、候補ID 1は、job_ids 1、2、および3に対して電子メールでtrueに設定されます。

1つのクエリでこれを行う方法はありますか?WHEN CASEステートメントを見てきましたが、この場合は当てはまらないと思いますか?数千人になる可能性があるため、候補者ごとに複数のクエリを実行したくありません。

4

3 に答える 3

3

グループが同じ基準と同じ更新値をUPDATE共有できる場合は、グループごとに1つのクエリを実行できます。WHERE

UPDATE tbl SET value = TRUE WHERE id IN(1,2,3,4,5,6);
UPDATE tbl SET value = FALSE WHERE id IN(7,8,9,10,11);

または、基準が十分に単純である場合は、WHEN句または一部の句を使用できます。IF

UPDATE tbl SET value = IF(id = 1) WHERE id IN(1,2);
UPDATE tbl
    SET value = CASE
                    WHEN id IN (1,2,3,4,5,6) THEN TRUE
                    WHEN id IN (7,8,9,10,11) THEN FALSE
                    ELSE value
                END
    WHERE id IN (1,2,3,4,5,6,7,8,9,10,11);

おそらく数千のWHENケースがあるので、構築/変更するのは面倒かもしれません。最初のオプションを選択します。

古いkey=>value配列を反転し、すべてのIDを値に接続したままにします。

foreach($list AS $id => $value) {
    $list2[$value][] = $id;
}

value => keys配列を反復処理し、UPDATEすべてのキーの値を一度に一括更新できるクエリを作成します。

于 2012-08-02T12:09:44.480 に答える
0

mysqlの代わりにPHPでmysqli拡張機能を使用している場合は、「;」で区切った複数のステートメントを作成することもできます。それらすべてを1つのクエリで送信します。これにより、ケースを含む複雑なUPDATEよりもコードが少し単純になる可能性があります。

これは、単一の複雑なUPDATEステートメントよりもはるかに高いパフォーマンスを要するとは思いません。

于 2012-08-02T12:28:02.967 に答える
0

これはあなたが求めているものですか?PHPでSQLを動的に生成しなくても、fromとwhereを使用して結合を実行できます。

UPDATE " . DB_PREFIX . "candidate_to_job c2j 
SET emailed = 1
FROM  " . DB_PREFIX . "job j 
WHERE j.job_id = c2j.job_id and
      c2j.emailed = 0
于 2012-08-02T12:53:36.300 に答える