2017-03-06 74 views
1

我的更新查询出现问题。如果action_type = abuse只需要最后一位用户的行,我需要将notify_admin从0改为1。 (结果应与ID = 9和id = 13行)SQL无法更新几行

我想类似的东西:

UPDATE user_log SET notify_admin = 1 
WHERE id IN (
    SELECT DISTINCT user_id FROM (SELECT user_id FROM user_log) as UNIKALNE 
) AND action_type LIKE 'abuse' 

不幸的是,只更新1行(ID = 3)。

这里是我的表:

CREATE TABLE IF NOT EXISTS `user_log` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id` int(10) unsigned NOT NULL, 
    `action_type` enum('login','logout','abuse') CHARACTER SET latin1 NOT NULL, 
    `notify_admin` tinyint(1) NOT NULL DEFAULT '0', 
    `saved` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=15; 

INSERT INTO `user_log` (`id`, `user_id`, `action_type`, `notify_admin`, `saved`) VALUES 
(1, 1, 'login', 0, '2015-11-02 12:13:14'), 
(2, 1, 'logout', 0, '2015-11-02 13:12:11'), 
(3, 1, 'abuse', 0, '2016-01-03 14:10:02'), 
(4, 2, 'abuse', 0, '2016-01-04 17:47:03'), 
(5, 2, 'login', 0, '2016-01-04 18:11:55'), 
(6, 1, 'abuse', 0, '2016-01-04 18:23:57'), 
(7, 1, 'abuse', 0, '2016-01-04 18:24:23'), 
(8, 2, 'logout', 0, '2016-01-04 18:25:24'), 
(9, 1, 'abuse', 0, '2016-01-04 18:25:32'), 
(10, 1, 'login', 0, '2016-01-05 21:02:59'), 
(11, 3, 'login', 0, '2016-01-05 21:28:43'), 
(12, 3, 'logout', 0, '2016-01-05 21:52:01'), 
(13, 2, 'abuse', 0, '2016-01-05 22:00:35'), 
(14, 1, 'logout', 0, '2016-01-05 22:12:09'); 
+2

您选择不同的用户ID 'SELECT DISTINCT USER_ID FROM(SELECT USER_ID FROM USER_LOG)作为 UNIKALNE)' 所以只有一排与USER_ID将被选择,这是ID = 3 – Krishnakumar

+0

什么如果后面的数据集看起来像 – Strawberry

+0

它应该改变notify_admin为1,只有ID为9和13的行(因为有action_type =滥用,最后发生id = 1的用户和id = 2的用户) – ReVaN

回答

1

您需要首先获取每个用户的最近saved值,然后更新替换列User_id

UPDATE user_log 
JOIN 
(
    select id from user_log JOIN (
    select user_id,max(saved) max_saved 
    from user_log 
    where action_type="abuse" 
    group by user_id 
) t 
    ON t.user_id = user_log.user_id AND t.max_saved = user_log.saved 
) t2 
ON user_log.id = t2.id 
SET notify_admin = 1 
+0

这将标记_every_最新的用户记录被滥用,不仅仅是它是所有记录中的最新记录。 –

+0

@TimBiegeleisen也许我在这里失去了一些东西。我认为查询工作正常。你介意看看小提琴:http://sqlfiddle.com/#!9/a07e1c/1 –

+0

是的,它的工作原理。谢谢你:) – ReVaN

0

在这里,您是从具有不同表检查USER_ID所以它会给1,2,3只,然后用滥用行为类型进行比对,将更新它匹配行3 。

id如果要更新所有行

UPDATE user_log SET notify_admin = 1 WHERE id IN (SELECT DISTINCT id FROM (SELECT id FROM user_log) as UNIKALNE) AND action_type LIKE 'abuse' 
+0

我试过但它改变所有发生的地方action_type ='滥用',但我只需要最后2(对于ID = 9和ID = 13) – ReVaN

+0

如果你想为ID 9,13,那么只有你nique字段是'id'在(9,13)中添加id –

+0

是的,但它应该动态更新,所以它应该只更新id为9和13的行的原因是,对于此用户行,此行最后发生action_type ='滥用' – ReVaN