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
我有这个 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