Mysql 更新在子查询中抛出错误

Mysql update thows error in 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 = ?;

Table 语法:

+------------+------------+------+-----+---------+-------+
| 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

在 google 中搜索了一个小时并尝试了很多想法后,我放弃了搜索,所以我请求您给我提示如何修复此查询。

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

感谢影子,这是解决方案:

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";

这是 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