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 (1 人のユーザー) が次の解決策を提供しました。

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 日間となります。解決策は、ユーザーがログインするたびに days 列の値を増やすことです。

ログイン日がmysql更新クエリでlastlogin列よりも大きい場合、どうすればdays列の値を増やすことができますか?

4

1 に答える 1

0

条件式を使いたい場合は CASE 式が便利です

SQLFiddle CASE の例

そのドキュメントから、MySQL には、ここで使用できるより単純な IF 式もあることがわかります。

SQLFiddle IF の例

于 2013-05-01T15:06:43.143 に答える