数据库
首页 > 数据库> > php-更新MySQL中的多行而没有循环

php-更新MySQL中的多行而没有循环

作者:互联网

我正在尝试为我创建的求职网站编写电子邮件通知系统,目前正在寻找将一定数量的工作分组在一起的方法,然后再向候选人发送电子邮件

我有一个表,我称为候选人表,其中包含候选人表ID,工作表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,例如,将对job_ids 1、2和3通过电子邮件将候选人候选ID设置为true

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

解决方法:

您可以为每个组运行一个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案例,可能很难构建/更改,那么我会选择第一种方法:

翻转旧的key => value数组,并保持所有ID连接到一个值:

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

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

标签:sql-update,mysql,php
来源: https://codeday.me/bug/20191201/2077285.html