Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用case更新sql,并更新值,无论哪种情况正确_Mysql_Sql - Fatal编程技术网

Mysql 使用case更新sql,并更新值,无论哪种情况正确

Mysql 使用case更新sql,并更新值,无论哪种情况正确,mysql,sql,Mysql,Sql,这将更新两行的时间戳,一行是前一个日志=1,另一行是当前日志=1。如何仅更新当前日志=1 下表: UPDATE users SET log = CASE WHEN id = 2 THEN 1 ELSE 0 END WHERE r_id = 1 答复: CREATE TABLE `users` ( `sno` int(255) NOT NULL AUTO_INCREMENT, `id` varchar(255) NOT NULL, `r_id` varchar(255) NOT

这将更新两行的时间戳,一行是前一个日志=1,另一行是当前日志=1。如何仅更新当前日志=1

下表:

UPDATE users SET log = CASE WHEN id = 2 THEN 1  ELSE 0 END WHERE r_id = 1  
答复:

CREATE TABLE `users` (
  `sno` int(255) NOT NULL AUTO_INCREMENT,
  `id` varchar(255) NOT NULL,
  `r_id` varchar(255) NOT NULL,
  `log` int(11) NOT NULL,
  `last_login` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`sno`)
) 



INSERT INTO `users` (`sno`, `id`, `r_id`, `log`, `last_login`) VALUES
(1, '1', '1', 0, '2014-05-13 14:44:09'),
(2, '2', '1', 0, '2014-05-13 14:45:07'),
(3, '3', '1', 0, '2014-05-13 14:44:09'),
(4, '4', '1', 0, '2014-05-13 14:44:09'),
(5, '5', '1', 0, '2014-05-13 15:19:23'),
(6, '6', '2', 1, '0000-00-00 00:00:00'),
(7, '7', '3', 1, '0000-00-00 00:00:00');
NOW()
是一个函数,不应在引号中:

UPDATE users SET log = CASE WHEN id = 2 THEN 1  ELSE 0 END,last_login = CASE WHEN id = 2 THEN now()  ELSE last_login END WHERE r_id = 1  

通过使用引号,您告诉MySQL值是文本字符串“now()”而不是函数。

案例中,您似乎有两个条件,但只有一个
,然后
。以下是关于您想要什么的推测:

UPDATE users SET log = CASE WHEN id = '2' THEN 1 AND last_login = NOW() ELSE 0 END WHERE r_id = '1'
UPDATE users
    SET log = (CASE WHEN id = '2' AND
                         last_login >= now() - interval 1 second
                    THEN 1 
                    ELSE 0
               END)
    WHERE r_id = '1';
请注意,将
last\u login
等值与
now()进行比较是非常危险的。你可能永远也找不到匹配的。也许是这样的:

UPDATE users
    SET log = (CASE WHEN id = '2' AND last_login = now() THEN 1 
                    ELSE 0
               END)
    WHERE r_id = '1';
编辑:

如果只想更新满足这些条件的
users
中的最后一行,可能需要:

UPDATE users SET log = CASE WHEN id = '2' THEN 1 AND last_login = NOW() ELSE 0 END WHERE r_id = '1'
UPDATE users
    SET log = (CASE WHEN id = '2' AND
                         last_login >= now() - interval 1 second
                    THEN 1 
                    ELSE 0
               END)
    WHERE r_id = '1';

这会执行,但不会更新值日志或时间戳。我如何更新案例的时间戳,而不更新其他上次登录的时间戳?没有得到您想要做的事情。您可以解释一下更新部分吗?@AbhikChakraborty我正在尝试将log=1更新给刚刚登录并更新其日志的用户上次登录时间戳,但不是其他时间戳。在我的情况下,2行时间戳被更新。以前的日志=1行,现在是刚刚登录他所在行的用户。我只想让刚刚登录他所在行的用户更新时间戳,而不是之前的Hello先生。已经有一段时间了。感谢您的响应,但我没有匹配上次登录。我只想更新当前登录的用户,他的时间戳值。我正在尝试将log=1更新到刚刚登录的用户,并更新其上次登录的时间戳,而不是更新其他用户的时间戳。在我的情况下,更新了2行时间戳。上一个log=1行,现在是刚刚登录其行的用户。我只希望刚刚登录其行的用户更新时间戳,而不是上一行或任何其他行世界其他地区的时间放大器。@jason。我假设您的问题的真正答案是使用触发器,基于某人登录的时间(例如登录记录插入登录表的时间)。是的,完全正确,但如果有另一个用户具有相同的r_id,则其余的用户log=0,登录的用户log=1,并且只有他的时间戳将被更新,而不是其他。如果两行之间的r_id匹配,则基本上有两行正在更新其时间戳