我有这个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";
答案 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