MySQL - 增加列值或插入数据(如果不存在)

时间:2012-01-19 22:43:39

标签: mysql

我有用户访问该网站。用户可以执行一系列不同的操作。我想要一个计数器来计算用户执行该操作的次数。问题是,它每天都在每天开始。 因此,模型具有 Id,用户,动作,时间,日期

我想使用它,但我不能,因为动作不是关键,也不可能。其他任何字段都不是关键字。

insert into useractions (user, action, times) values (2, 3, 1)
on duplicate key update times = times + 1;

3 个答案:

答案 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)

您可以在列组合上使用唯一键。这样,您可以使该组合(用户,操作,日期)唯一,然后您的查询就可以正常工作。

这确实是最简单的解决方案。您确实需要更改表格的权利。

相关问题