2014-03-06 34 views
1

我需要提供关于会员登录作为示例如下数据:MySQL表设计 - 用户登录时报

LAST HOUR 654 
LAST DAY 15,648 
LAST WEEK 109,536 
LAST MONTH 460,051 
LAST YEAR 5,520,614 

我想知道这可能是一个表的最佳结构来保存在MySQL信息D B。

目前,我想只是存储:

user datetime 

我希望这会随着时间的推移非常大,并且变得缓慢进行查询。

有没有更好的方式来构建表来获取登录信息 - 小时,星期,星期,月份,年份等?在日志表中的每一行重复

+0

什么是您的服务器端脚本? –

+0

PHP是我的服务器端语言 – Adam

+0

检查我的答案 –

回答

2
$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

有用户信息是非常糟糕的,看看Normalizing your database

  1. 有唯一的ID
  2. 创建日志表创建一个用户表,而不是用户在该表,通过该用户的ID来引用该用户。

你也可以使用一个时间戳值,并有MySQL的initialize/auto-set当行添加

所以,你的结构可能看起来像场:

user_tbl 
- uid (int) 
- name 
- datax 
- etc 

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

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

$time = // timestamp value from database 

使用PHP date()功能

$date = date('m/d/Y', $time); 

其他值

$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

我会像你那样做暗示,只是用户和日期时间字段(不叫日期时间)。为日期时间设置CURRENT_TIMESTAMP的默认值。您可以基于日期时间归档或分区数据,但MySQL将处理数百万行没有问题。在日期时间字段上放置一个索引。然后使用视图做你的计数,像这样:

SELECT COUNT(YEAR(testcol)) AS CNT FROM test.test;