我正在尝试为我制作的招聘网站编写电子邮件通知系统,目前正在考虑将一定数量的工作分组在一起,然后再向候选人发送电子邮件
我有一个名为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语句,但我不认为这适用于这种情况?我真的不想为每个候选人运行多个查询,因为可能有数千个!
答案 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