0

我在 mysql 表中有以下结构:

-------------------------------------
| id | username | lastlogin  | days |
-----+----------+------------+-------
| 1  | user-xyz | 2013-04-29 | 0    |
-------------------------------------

上面的“lastlogin”列是日期列,“days”列是 int(3) 列。我想要做的是,当用户登录时,lastlogin 列将像往常一样每次更新。同时,如果登录日期(用户登录时)大于 lastlogin 列的日期,“days”列将递增。如果用户在同一天再次登录,则天数将相同(不会更新)。

在这种情况下,mysql 查询将是什么?

查询格式将是这样的:

$logindate = date("Y-M-D",time());

UPDATE table
SET lastlogin=$logindate, days=days+1 if $logindate>lastlogin
WHERE usename=user-xyz

我之前发布了这个问题,Vishy(一位用户)给出了以下解决方案:

UPDATE table
SET days=DATEDIFF($logindate,lastlogin), lastlogin=$logindate
WHERE username='xyz'

但是代码并没有完全按照我的意愿做事。因为假设 2013 年 4 月 21 日和 2013 年 4 月 30 日之间的日期差为 10 天。因此,如果用户在 2013 年 4 月 30 日登录,它将在天数列中添加 10。但用户可能不会在 4 月 21 日至 30 日之间每天登录。他/她可能在 2013 年 4 月 21 日、23 日、25 日、27 日和 30 日登录,所以他/她实际上登录了 5 天,但上面的代码将放置 10 天。解决方案是在用户登录时增加天数列的值。

那么,如果登录日期大于 mysql 更新查询的 lastlogin 列,我该如何增加 days 列中的值呢?

4

1 回答 1

0

当您想要执行条件表达式时, CASE 表达式很方便。

SQLFiddle CASE 示例

从该文档中,我看到 MySQL 也有一个更简单的 IF 表达式,可以在这里使用:

SQLFiddle IF 示例

于 2013-05-01T15:06:43.143 回答