2012-02-08 70 views
2

我很想知道如何使用CASE和JOIN進行更新。這個例子來自我的Drupal數據庫。 content_typenid作爲主鍵;另一方面,term_node可以具有與匹配到不同的tids相同的nid的多個行。基於MySQL在哪兒將愉快地分析查詢:正確的MySQL UPDATE語法... JOIN ... CASE?

UPDATE `content_type` 
LEFT JOIN `term_node` USING(nid) 
SET 
    `field_m03` = 1 
    WHERE tid = 696; 

上面更新所有行content_type其中有nidterm_node匹配(tid = 696),因爲它應該。 但是,當我嘗試使用CASE串入幾個條件時,它將不起作用。沒有錯誤,但0行受到影響:

UPDATE `content_type` 
LEFT JOIN `term_node` USING(nid) 
SET 
    `field_m03` = (CASE 
    WHEN (tid = '696') THEN '1' 
    WHEN (tid = '697') THEN '2' 
    WHEN (tid = '698') THEN '3' 
    WHEN (tid = '699') THEN '4' 
    WHEN (tid = '700') THEN '5' 
    ELSE `field_m03` 
    END); 

也試過沒有括號和單引號,沒有改變。

+0

什麼表是field_m03中的? – 2012-02-08 14:10:05

+0

'field_m03'來自表'content_type' – 2012-02-08 14:18:43

回答

1

您的語法看起來正確。

如果你的MySQL服務器有安全更新(SQL_SAFE_UPDATES)開啓,那麼您的服務器將中止沒有一個WHERELIMIT條款的任何更新。

1

我不知道答案爲什麼它不起作用,但我想建議你再考慮一遍。

您的UPDATE需要全表掃描。如果給定的tid只是實際存在的一小部分tid,單個更新可以使用索引。

所以它可能是更容易和便宜發行單一UPDATE S,或者至少限制UPDATE的範圍內

... WHERE tid BETWEEN 696 AND 700 

+0

謝謝,不知何故使WHERE子句確實使CASE查詢工作...... – 2012-02-08 14:36:08

+1

@Pedro,絕對檢查我的答案和SQL_SAFE_UPDATES設置。 – 2012-02-08 14:41:20

0

如何在表格中使用ALIAS

UPDATE `content_type` a 
LEFT JOIN `term_node` b USING(nid) 
SET 
    a.`field_m03` = (CASE 
    WHEN (b.tid = '696') THEN '1' 
    WHEN (b.tid = '697') THEN '2' 
    WHEN (b.tid = '698') THEN '3' 
    WHEN (b.tid = '699') THEN '4' 
    WHEN (b.tid = '700') THEN '5' 
    ELSE a.`field_m03` 
    END); 
+1

絕對可以用別名讀取,但這不可能是解決方案。如果字段名稱不明確,MySQL會抱怨。 – 2012-02-08 14:21:24