2013-12-10 70 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謝謝!糾正。 –