我有用户访问该网站。用户可以执行一系列不同的操作。我想要一个计数器来计算用户执行该操作的次数。问题是,它每天都在每天开始。 因此,模型具有 Id,用户,动作,时间,日期
我想使用它,但我不能,因为动作不是关键,也不可能。其他任何字段都不是关键字。
insert into useractions (user, action, times) values (2, 3, 1)
on duplicate key update times = times + 1;
答案 0 :(得分:6)
您将数据列从插入示例中删除,但是您多次提到它,所以我认为存在。另外,我假设它是一个实际日期(不是时间戳或日期时间)。
如果您在(用户,操作,日期)上添加唯一索引,那么您的查询将起作用。
这是DDL:
alter table useractions
add unique index unique_idx (user,action,date);
你的DML(添加日期栏):
insert into useractions (user, action, times, date) values (2, 3, 1, current_date())
on duplicate key update times = times + 1;
答案 1 :(得分:2)
您是否绝对想在插入动作时计算计数器值?简单地用时间戳跟踪用户和操作可能更简单,如下所示:
+--------+----------+---------------------+
| UserID | ActionID | Time |
+--------+----------+---------------------+
| 1 | 1 | 2012-01-19 14:47:03 |
| 1 | 2 | 2012-01-19 14:48:12 |
| 1 | 3 | 2012-01-19 14:48:15 |
| 2 | 1 | 2012-01-19 14:49:33 |
| 2 | 1 | 2012-01-18 14:49:42 |
然后用查询计算每日计数:
SELECT UserID,
ActionID,
DATE(Time) AS Date,
COUNT(*) AS n
FROM actions
GROUP BY UserID,ActionID,Date
ORDER BY Date,UserID,ActionID;
+--------+----------+------------+---+
| UserID | ActionID | Date | n |
+--------+----------+------------+---+
| 1 | 2 | 2012-01-17 | 2 |
| 1 | 3 | 2012-01-17 | 2 |
| 3 | 2 | 2012-01-17 | 6 |
| 1 | 1 | 2012-01-18 | 1 |
| 1 | 2 | 2012-01-18 | 1 |
| 1 | 3 | 2012-01-18 | 4 |
答案 2 :(得分:0)
您可以在列组合上使用唯一键。这样,您可以使该组合(用户,操作,日期)唯一,然后您的查询就可以正常工作。
这确实是最简单的解决方案。您确实需要更改表格的权利。