2012-08-02 108 views
3

我正在嘗試寫一個電子郵件通知系統,用於我發佈的求職招聘網站,並且目前正在將一定數量的作業分組在一起,然後將電子郵件發送給候選人在沒有循環的情況下在MySQL中更新多行

我有我已經叫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 I組他們在一起,所以我有一個數組看起來像這樣:

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

與數組鍵值爲候選ID和作業ID數組的值

我想要使用該數組 - 電子郵件發送後 - 將更新candidate_to_job表設置通過電子郵件發送到true,例如candidate_id 1將通過電子郵件發送設置爲true爲job_ids 1,2和3

有沒有一種方法可以在一個查詢中做到這一點?我查看了WHEN CASE的陳述,但我不認爲這適用於這種情況?我真的不想爲每個候選人運行多個查詢,因爲可能有數千個!

回答

3

如果該組可以共享相同的WHERE條件和相同的更新值,則可以爲每個組運行一個UPDATE查詢。

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情況下,可能是一個麻煩來構建/改變,我會跟第一個選項去:

翻轉舊密鑰=>值數組,並保持連接到所有IDS一個值:

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

迭代通過值=>鍵陣列和建立UPDATE的查詢可以批量更新一次所有密鑰的值。

+0

我甚至從來沒有想過翻轉陣列。這是一個好主意,我可以用鍵作爲另一個數組作爲工作id,然後是一個候選數組的值 - 謝謝! – Andy 2012-08-02 13:09:11

+0

@ypercube謝謝你,我從來沒有想過在'CASE'中使用'IN',SQL語法不太直觀,至於什麼是固定的流控制結構還是什麼?預定義函數與語句語法等。 – 2012-08-02 14:36:19

0

如果您在PHP中使用mysqli擴展而不是mysql,您還可以編寫由';'分隔的多語句,並將其全部發送到一個查詢中。這可能會導致比具有個案的複雜UPDATE更簡單的代碼。

我不認爲這會比單個複雜的UPDATE語句花費更多的性能。

+1

作爲一個經驗法則,我總是「壓縮」多個語句,我可以一次運行,因爲PHP和MySQL之間的通信協議通過TCP工作(它通常是本地數據庫,但它是仍然是TCP),限制這些TCP通信與限制磁盤IO或任何其他昂貴的資源一樣好。 – 2012-08-02 14:33:22

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 
+0

是不是就像UPDATE「。DB_PREFIX。」candidate_to_job SET電子郵件= 1在哪裏電子郵件= 0?似乎沒有任何標準要更新哪些行 – Andy 2012-08-02 13:06:04

+0

並且將隱式過濾器應用於表作業上的任何匹配。如果你從你的第一個查詢的結果創建你的PHP數組,然後這應該工作。 – pyrospade 2012-08-02 13:39:39

+0

我想你可能誤解了。每個工作都在工作表中,所以WHERE j.job_id = c2j.job_id總是會是真的不是嗎?當作業發佈時候,條目將被添加到candidate_to_job表中,並且該條目與候選人作業標準相匹配 – Andy 2012-08-02 13:47:49

相關問題