在没有循环的情况下在MySQL中更新多行

时间:2012-08-02 11:53:23

标签: php mysql sql-update

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

我有一个名为candidate_to_job的表,其中包含candidate_id,job_id和“emailed”布尔值

我正在努力解决的问题是在发布新作业并发送电子邮件时更新该表。到目前为止,当发布新工作时,我运行以下内容:

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表设置,例如,对于job_ids 1,2和3,candidate_id 1将通过电子邮件设置为true

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

3 个答案:

答案 0 :(得分:3)

如果该群组可以共享相同的UPDATE条件和相同的更新值,则每个群组可以运行一次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个案例,可能是构建/更改的麻烦,我会选择第一个选项:

翻转旧密钥=>值数组并将所有ID连接到值:

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

遍历value => keys数组并构建可以一次批量更新所有键值的UPDATE个查询。

答案 1 :(得分:0)

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

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

答案 2 :(得分: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