3

我正在尝试为我创建的招聘网站编写一个电子邮件通知系统,目前正在考虑将一定数量的工作组合在一起,然后再向候选人发送电子邮件

我有一个我称之为candidate_to_job 的表,其中包含candidate_id、job_id 和“通过电子邮件发送”的布尔值

我正在努力的是在发布新工作并发送电子邮件时更新该表。到目前为止,当发布新工作时,我运行以下命令:

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 数组

我想要使​​用该数组执行的操作 - 在发送电子邮件后 - 将通过电子邮件发送给 true 的 Candidate_to_job 表设置更新为 true,例如,对于 job_ids 1、2 和 3,candidate_id 1 将通过电子邮件设置为 true

有没有办法在一个查询中做到这一点?我看过 WHEN CASE 语句,但我认为这不适用于这种情况?我真的不想为每个候选人运行多个查询,因为可能有数千个!

4

3 回答 3

3

You can run one UPDATE query per group provided that the group can share the same WHERE criteria and the same update values.

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);

Or you can use the WHEN clause or even some IF clauses provided that the criteria are simple enough.

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);

Having possibly thousands of WHEN cases, may be a hassle to build/change, I'd go with the first option:

Flip the old key=>value array and keep all ids connected to a value:

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

Iterate through the value=>keys array and build UPDATE queries that can bulk update the value for all keys at once.

于 2012-08-02T12:09:44.480 回答
0

这就是你所追求的吗?您可以使用 from 和 where 进行连接,而无需在 PHP 中动态生成 SQL。

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 回答
0

如果您在 PHP 中使用 mysqli 扩展而不是 mysql,您还可以编写多个以 ';' 分隔的语句 并在一个查询中发送所有这些。这可能会导致代码比带有案例的复杂 UPDATE 稍微简单一些。

我认为这不会比一个复杂的 UPDATE 语句花费更多的性能。

于 2012-08-02T12:28:02.967 回答