2011-07-26 72 views
0
UPDATE `Starcraft2uvsu` 
SET IF(`Starcraft2uvsu`.username = 'wasd', 'report1', 'report2') = 'Win' 
FROM `Starcraft2uvsu` 
WHERE `Starcraft2uvsu`.username = 'wasd' 

錯誤phpMyAdmin是隨地吐痰是...MySQL的更新錯誤

#1064 - You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near 
'If(Starcraft2uvsu.username = wasd, 'report1', 'report2') = 'Win' FROM Starcraft2' at line 1 

它甚至有可能通過if語句來設置列名?我想那是殺手。

的神奇查詢爲答案和註釋的組合..

UPDATE Starcraft2uvsu 
SET report1 = CASE WHEN Starcraft2uvsu.username = 'wasd' THEN 'win' ELSE report1 END, 
    report2 = CASE WHEN Starcraft2uvsu.username <> 'wasd' THEN 'win' ELSE report2 END 
WHERE Starcraft2uvsu.username = 'wasd' OR Starcraft2uvsu.username2 = 'wasd' 

回答

1

是,也不是。你這樣做:

set report1 = if (username = 'wasd', 'Win', report1), 
    report2 = if (username = 'wasd', report2, 'Win') 
+0

UPDATE'Starcraft2uvsu' SET報告1 = IF(用戶名= 'WASD',「贏」, '報告2'), 報告2 = IF(用戶名= 'WASD',報告2, '贏')FROM'Starcraft2uvsu'其中username = 'WASD' 給 #1064 - 你在你的SQL錯誤句法;檢查與您的MySQL服務器版本相對應的手冊,以便在第3行的'FROM'Starcraft2uvsu' WHERE username ='wasd''處使用正確的語法 我討厭SQL:P – Jamie

+0

from子句不屬於更新聲明。 – ysth

+0

我也有點困惑你的where子句;你想根據用戶名更新不同的列,但你選擇一個特定的用戶名? – ysth

1

不,你不能在SQL(或大多數語言)中選擇這樣的賦值的左邊。您將需要一個IF語句,該語句在另一分支中執行report1中的UPDATE,並在另一分支中執行UPDATE,report2。您也可以將該邏輯上移到您的業務邏輯層,並讓它構建正確的語句UPDATE。我個人偏好將這個邏輯放在數據庫之外。

+0

糟糕,我正在考慮存儲過程的語法真的......這也有效。但我認爲你想要做的事情不可能真正做到,或者正如Ysth所說,只能用一個有趣的技巧來完成。 –

+0

是的,我想保持在數據庫上,如果我可以 – Jamie

2

很難確切地告訴你要從語法中更新什麼。你想使用類似這樣的CASE語句:

UPDATE Starcraft2uvsu 
SET report1 = CASE WHEN Starcraft2uvsu.username = 'wasd' THEN 'win' ELSE report1 END, 
    report2 = CASE WHEN IFNULL(Starcraft2uvsu.username,'') <> 'wasd' THEN 'win' ELSE report2 END 
FROM Starcraft2uvsu 
WHERE Starcraft2uvsu.username = 'wasd' 
+0

對不起,我不能選擇你的答案,我標記了你。 – Jamie

+0

請注意,如果使用'<>'而不是'Starcraft2uvsu.username ='wasd'THEN report2 ELSE'win'',那麼您將創建一個空的用戶名而不會更改任一字段。 – ysth

+0

好點,可以在那裏使用IFNULL – brendan

0

你有什麼也是相同的:

UPDATE Starcraft2uvsu 
SET report1 = 'win' 
WHERE Starcraft2uvsu.username = 'wasd' ; 

UPDATE Starcraft2uvsu 
SET report2 = 'win' 
WHERE Starcraft2uvsu.username <> 'wasd' 
    AND Starcraft2uvsu.username2 = 'wasd' ;