Mysql更新在子查询中发生错误

时间:2016-03-22 17:27:36

标签: mysql sql select subquery

我有这个MySQL查询,它应该重新计算用户离线时的在线时间。

UPDATE isonline SET onlineTime = (
    (SELECT ROUND(UNIX_TIMESTAMP(CURTIME(4 ) ) * 1000 ) ) - //currentmillis
    (SELECT lastOnline FROM isonline WHERE nick = ? AND isOnline = 1 ) + 
    (SELECT onlineTime FROM isonline WHERE nick = ? AND isOnline = 1 )//oldonlinetime
) ,isOnline = false WHERE nick = ?;

表语法:

+------------+------------+------+-----+---------+-------+
| Field      | Type       | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| nick       | text       | NO   |     | NULL    |       |
| lastOnline | bigint(20) | NO   |     | NULL    |       |
| onlineTime | bigint(20) | NO   |     | NULL    |       |
| isOnline   | tinyint(4) | NO   |     | NULL    |       |
+------------+------------+------+-----+---------+-------+

式:     newOnlineTime = oldOnlineTime + CurrentTimeInMS - lastTimeOnlineInMS

(MS =毫秒)

可悲的是我得到了这个错误:

Error: ER_UPDATE_TABLE_USED: Table 'isonline' is specified twice, 
both as a target for 'UPDATE' and as a separate source for data

在谷歌搜索了一个小时并尝试了很多想法后我放弃了搜索,所以我要求你给我一个如何解决这个问题的提示。

如果需要更多信息:请询问

感谢Shadow这是解决方案:

UPDATE isonline SET onlineTime = (SELECT f FROM ((SELECT
((SELECT ROUND(UNIX_TIMESTAMP(CURTIME(4 ) ) * 1000 ) ) -
(SELECT lastOnline FROM isonline WHERE nick = "testuser" AND isOnline = 1 ) + 
(SELECT onlineTime FROM isonline WHERE nick = "testuser" AND isOnline = 1)) as f FROM dual) as t)
) ,isOnline = false WHERE nick = "testuser";

1 个答案:

答案 0 :(得分:0)

这是mysql的一个众所周知的烦人特征。您可以通过添加另一个子选择层来解决此限制:

UPDATE isonline SET onlineTime = (SELECT f FROM (SELECT
    ((SELECT ROUND(UNIX_TIMESTAMP(CURTIME(4 ) ) * 1000 ) ) - //currentmillis
    (SELECT lastOnline FROM isonline WHERE nick = ? AND isOnline = 1 ) + 
    (SELECT onlineTime FROM isonline WHERE nick = ? AND isOnline = 1) as f FROM dual) as t)//oldonlinetime
) ,isOnline = false WHERE nick = ?;

我希望我的括号正确:S