首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL表设计-用户登录时间

MySQL表设计-用户登录时间
EN

Stack Overflow用户
提问于 2014-03-06 06:17:33
回答 3查看 120关注 0票数 1

我需要提供有关成员登录的以下数据作为示例:

代码语言:javascript
复制
LAST HOUR 654
LAST DAY 15,648
LAST WEEK 109,536
LAST MONTH 460,051
LAST YEAR 5,520,614

我想知道在MySQL DB中保存这些信息的表的最佳结构是什么。

目前,我正在考虑仅仅存储:

代码语言:javascript
复制
user datetime

我预计随着时间的推移,这会变得非常大,而且查询速度也会变慢。

是否有更好的方法来构造一个表格来获取登录信息-小时、日、周、月、年等?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-06 06:48:05

代码语言:javascript
复制
$current_time = strtotime(date('d-M-Y g:i:s A'));

$last_hour = $current_time - 3600;
$last_day = $current_time - (3600*24);
$last_week = strtotime("-1 week");
$last_month = strtotime("-1 month");
$last_year = strtotime("-1 year");

// now count

// count for last hour
$sql = "SELECT COUNT(user_id) AS cnt FROM `your_table` WHERE datetime>='$last_hour' ";

// count for last day
$sql = "SELECT COUNT(user_id) AS cnt FROM `your_table` WHERE datetime>='$last_day' ";

// count for last week
$sql = "SELECT COUNT(user_id) AS cnt FROM `your_table` WHERE datetime>='$last_week' ";

// count for last month
$sql = "SELECT COUNT(user_id) AS cnt FROM `your_table` WHERE datetime>='$last_month' ";

// count for last year
$sql = "SELECT COUNT(user_id) AS cnt FROM `your_table` WHERE datetime>='$last_year' ";
票数 2
EN

Stack Overflow用户

发布于 2014-03-06 06:31:37

在日志表的每一行重复用户信息是非常糟糕的,请看使数据库规范化

  1. 创建一个具有唯一ID的用户表
  2. 创建logs表,而不是在该表中的user,将用户的ID引用到用户。

您还可以使用时间戳值,并在添加行时让MySQL 初始化/自动设置作为字段。

所以你的结构看起来可能是:

代码语言:javascript
复制
user_tbl
 - uid (int)
 - name
 - datax
 - etc

log_tbl
 - uid (int)
 - login_time (datetime/timestamp)

现在,要获取登录信息,取决于您使用的是哪种语言,可以解析时间戳。在PHP中:

代码语言:javascript
复制
$time = // timestamp value from database

使用PHP 日期()函数

代码语言:javascript
复制
$date = date('m/d/Y', $time);

其他价值

代码语言:javascript
复制
$year = $time/31556926 % 12; // to get year
$week = $time / 604800 % 52; // to get weeks
$hour = $time / 3600 % 24; // to get hours
$minute = $time / 60 % 60; // to get minutes
$second = $time % 60; // to get seconds
票数 2
EN

Stack Overflow用户

发布于 2014-03-06 06:43:17

我会像你建议的那样做,只是用户和日期时间字段(不称为日期时间)。将日期时间的缺省值设置为CURRENT_TIMESTAMP。您可以根据日期时间对数据进行归档或分区,但是MySQL将处理数百万行没有问题。在datetime字段上设置一个索引。然后使用视图进行计数,如下所示:

代码语言:javascript
复制
SELECT COUNT(YEAR(testcol)) AS CNT FROM test.test;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22216581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档