2017-03-06 87 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