Ошибка обновления MySQL - PullRequest
0 голосов
/ 26 июля 2011
UPDATE `Starcraft2uvsu` 
SET IF(`Starcraft2uvsu`.username =  'wasd',  'report1',  'report2' ) =  'Win' 
FROM `Starcraft2uvsu` 
WHERE `Starcraft2uvsu`.username =  'wasd'

Ошибка, которую выдает phpmyadmin: ...

#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'

Ответы [ 4 ]

2 голосов
/ 26 июля 2011

Трудно точно сказать, что вы пытаетесь обновить из своего синтаксиса.Вы хотите использовать оператор 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'
1 голос
/ 26 июля 2011

Нет, вы не можете выбрать левую часть присваивания, подобного этому, в SQL (или в большинстве языков).Вам понадобится оператор IF, который выполняет UPDATE на report1 в одной ветви и UPDATE на report2 в другой.Вы также можете переместить эту логику на уровень своей бизнес-логики и заставить ее построить правильное выражение UPDATE.Я бы предпочел не допускать этой логики в базу данных лично.

1 голос
/ 26 июля 2011

Да и нет. Вы делаете это как:

set report1 = if (username = 'wasd', 'Win', report1),
    report2 = if (username = 'wasd', report2, 'Win')
0 голосов
/ 26 июля 2011

То, что у вас есть, также эквивалентно этому:

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

UPDATE Starcraft2uvsu 
SET report2 =  'win' 
WHERE Starcraft2uvsu.username <> 'wasd'
  AND Starcraft2uvsu.username2 = 'wasd' ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...