【问题标题】:MySQL - Increment Column Value or Insert Data if not ExistsMySQL - 如果不存在,则增加列值或插入数据
【发布时间】:2012-02-14 14:36:50
【问题描述】:

我有用户访问该网站。用户可以做很多不同的动作。我想要一个计数器来计算用户执行该操作的次数。问题是,它是每天的,它每天都从头开始。 所以模型有,Id、User、Action、Times、Date

我想使用它,但我不能,因为 Action 不是键,也不能。其他字段也不能是键。

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

【问题讨论】:

    标签: mysql


    【解决方案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 |
      

      【讨论】:

      • 是的,我只是认为用户可能会访问 20 个页面......然后每个用户有 20 个页面,可能会有点大
      【解决方案3】:

      您在插入示例中忽略了数据列,但您多次提到它,所以我假设它存在。另外,我假设它是实际日期(不是时间戳或日期时间)。

      如果您在(用户、操作、日期)上添加唯一索引,那么您的查询将起作用。

      这是 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;
      

      【讨论】:

        猜你喜欢
        • 2015-05-03
        • 1970-01-01
        • 2017-04-24
        • 2013-06-21
        • 2013-07-23
        • 1970-01-01
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多