質問するログイン新規登録

回答編集履歴

1

sample

2019/05/21 03:46

投稿

yambejp
yambejp

スコア118110

answer CHANGED
@@ -1,4 +1,58 @@
1
1
  user_idでgorup byするのにidやpointは拾えません
2
2
  mysqlの場合エラーにならないだけで、いつも同じ値が正しく得られるわけではありません。
3
3
 
4
- とりあえずuser_idとdateにまたがった複合インデックスをつけるところから
4
+ とりあえずuser_idとdateにまたがった複合インデックスをつけるところから
5
+
6
+ # triggerのsample
7
+
8
+ ```SQL
9
+ CREATE TABLE `test_point_history` (
10
+ `id` int(11) NOT NULL,
11
+ `user_id` int(11) NOT NULL,
12
+ `point` int(11) NOT NULL,
13
+ `date` int(11) NOT NULL,
14
+ `expire_date` int(11) DEFAULT NULL
15
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
16
+
17
+ create table `last_point_get`(
18
+ `user_id` int primary key,
19
+ `date` int
20
+ );
21
+
22
+ drop trigger if exists trg_aft_insert;
23
+ delimiter //
24
+ create trigger trg_aft_insert_test_point_history after insert on test_point_history
25
+ for each row begin
26
+ insert last_point_get(`user_id`,`date`) values
27
+ (new.user_id,new.date) on duplicate key update `date`=values(`date`);
28
+ end
29
+ //
30
+ delimiter ;
31
+ ```
32
+ - データ投入
33
+ ```SQL
34
+ INSERT INTO `test_point_history` (`id`, `user_id`, `point`, `date`, `expire_date`) VALUES
35
+ (1, 1, 1320, 1519830000, NULL),
36
+ (2, 2, 387, 1522508400, NULL),
37
+ (3, 2, 1716, 1525100400, NULL),
38
+ (4, 1, 1717, 1527778800, NULL),
39
+ (5, 4, 1261, 1530370800, NULL),
40
+ (6, 1, 1304, 1533049200, NULL),
41
+ (7, 2, 1031, 1535727600, NULL),
42
+ (8, 3, 420, 1538319600, NULL),
43
+ (9, 4, 168, 1535727600, NULL),
44
+ (10, 1, 1859, 1540998000, NULL),
45
+ (11, 1, 1637, 1543590000, NULL),
46
+ (12, 1, 1125, 1551366000, NULL),
47
+ (13, 3, 219, 1551366000, NULL);
48
+ ```
49
+ - 結果
50
+ ```SQL
51
+ SELECT * FROM last_point_get;
52
+ ```
53
+ |user_id|date|
54
+ |:--:|:--:|
55
+ |1|1551366000|
56
+ |2|1535727600|
57
+ |3|1551366000|
58
+ |4|1535727600|