2012-03-26 68 views
1

指定用于更新目标表我有这样一个查询:MySQL的 - 不能从条款

UPDATE `user` 
SET mail='[email protected]' 
WHERE id = 
    IF((SELECT admin FROM user WHERE id = '1') > 2, 
     (SELECT id FROM user WHERE id='2'), 
     (SELECT id FROM user WHERE id = '1') 
    ) 

,结果我得到错误信息:

“你不能指定目标表'用户在FROM子句中更新“

我希望tu在'user'表的所有行中更新名为'mail'的列,其中'id'行是1或2,具体取决于名为'admin ”。请帮助corect语法。

+0

DUP:http://stackoverflow.com/questions/45494/mysql-error-1093-cant-specify-target-table-for-update-in-from-clause – bernie 2012-03-26 22:54:46

回答

0
UPDATE `user` 
SET email='[email protected]' 
WHERE id = (SELECT id FROM (SELECT IF((SELECT admin FROM user WHERE id = '1') > 2, 
             (SELECT id FROM user WHERE id = '2'), 
             (SELECT id FROM user WHERE id = '1')) AS id 
          ) AS t 
      ); 
+0

作品像魅力! – Kalreg 2012-03-26 23:05:31

0
  1. 在查询中使用同一个表多次时,就需要使用别名:

    SELECT * FROM用户U1 INNER JOIN用户U2 ON ...

  2. 什么那些点子选择?例如, 不是这部分“(SELECT id FROM user WHERE id ='2')”等于只写“2”?

+0

值id = 2只是一个例子。本例中的值2更改与会话中存储的用户登录值有关。 – Kalreg 2012-03-26 23:00:14

+0

@Kalreg:O.K.,但这是一个荒谬的例子。 'SELECT id FROM user WHERE id = example_value_stored_in_session'总是'example_value_stored_in_session'或'NULL'。 – ruakh 2012-03-26 23:01:13

+0

@Kalreg:是的,但选择一个** ID **记录,你已经知道该ID是毫无意义的......;) – poncha 2012-03-26 23:01:30