2013-12-10 69 views
0

我有一个用户统计表格,并只需要为每个用户选择最新的值:使用的MySQL选择多个最新值

林PHP时间戳输入日期/ lastlogin。

stat_id:自动递增

stat_user:将在

登录用户

stat_count:的时候,他在

stat_lastlogin记录量:他最后一次登录

表:user_stats

stat_id  | stat_user | stat_count | stat_lastlogin 
--------------------------------------------------------- 
1    | Admin  |  1  | 1386661327 
2    | User  |  1  | 1386661340 
3    | Guest  |  1  | 1386661358 
4    | Admin  |  2  | 1386662383 
5    | Guest  |  2  | 1386663794 
6    | Admin  |  3  | 1386663806 
7    | Super  |  1  | 1386663812 

所以我想达到的目标是显示输出时,以下几点:

stat_id  | stat_user | stat_count | stat_lastlogin 
--------------------------------------------------------- 
2    | User  |  1  | 1386661340 
5    | Guest  |  2  | 1386663794 
6    | Admin  |  3  | 1386663806 
7    | Super  |  1  | 1386663812 

可以有无限的用户量。

最终我希望每个月的统计信息显示每月的登录次数。

回答

2

利用MySQL的非标准GROUP BY扩展,你可以做

SELECT stat_id, stat_user, stat_count, stat_lastlogin 
    FROM 
(
    SELECT stat_id, stat_user, stat_count, stat_lastlogin 
    FROM table1 
    ORDER BY stat_lastlogin DESC 
) q 
GROUP BY stat_user 

或更标准的方式

SELECT t.stat_id, t.stat_user, t.stat_count, t.stat_lastlogin 
    FROM 
(
    SELECT stat_user, MAX(stat_lastlogin) stat_lastlogin 
    FROM table1 
    GROUP BY stat_user 
) q JOIN table1 t 
    ON q.stat_user = t.stat_user 
    AND q.stat_lastlogin = t.stat_lastlogin 
ORDER BY stat_user 

,或者如果stat_lastlogin没有被更新(这意味着更高的stat_id的更近的记录是)

SELECT t.stat_id, t.stat_user, t.stat_count, t.stat_lastlogin 
    FROM 
(
    SELECT MAX(stat_id) stat_id 
    FROM table1 
    GROUP BY stat_user 
) q JOIN table1 t 
    ON q.stat_id = t.stat_id 
ORDER BY stat_user 

输出:

 
| STAT_ID | STAT_USER | STAT_COUNT | STAT_LASTLOGIN | 
|---------|-----------|------------|----------------| 
|  6 |  Admin |   3 |  1386663806 | 
|  5 |  Guest |   2 |  1386663794 | 
|  7 |  Super |   1 |  1386663812 | 
|  2 |  User |   1 |  1386661340 | 

这里是SQLFiddle演示所有查询

+0

绝妙的答案!非常感谢你。 –

+0

您的第一种方式是完美的,当用户登录新记录时,每次都会添加一个更新的日期,然后每次都会向stat_count添加+1,因此最新的登录信息将始终具有最新的信息。我使用这种布局的唯一原因是因为我将不得不显示用户在以后每一年登录的每年每月多少次。 –

1

你能试试吗?

SELECT user_stat.* 
FROM user_stat INNER JOIN 
(
    SELECT stat_user, MAX(stat_lastlogin) as ll 
    FROM user_stats 
    GROUP BY stat_user 
) x ON user_stat.stat_user = x.stat_user AND user_stat.stat_lastlogin = x.ll 
+0

@Strawberry谢谢!纠正。 –