MySQL选择多个最新值


MySQL Select Multiple latest Values

我有一个包含用户统计数据的表,只需要为每个用户选择最新的值:

我使用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

可以有无限数量的用户。

最终,我希望统计数据显示每年每月的登录次数。

利用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|管理员|3|1386638806||5 |客人|2 | 1386663794||7 |超级|1 | 1386663812||2|用户|1|1386661340|

以下是所有查询的SQLFiddle演示

你能试试这个吗?

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