2015-02-24 21 views
0

讓我們說,我有一個喜歡有數據,所以表sign_ins:(真正的表有350萬行)分組SQL查詢(MySQL的) - 爲了通過

+-----------+---------+------------------+ 
| school_id | user_id | date(created_at) | 
+-----------+---------+------------------+ 
|   1 |  4 | 2009-04-20  | 
|   1 |  4 | 2009-04-21  | 
|   1 |  4 | 2009-05-06  | 
|   1 |  5 | 2009-04-20  | 
|   1 |  5 | 2009-06-26  | 
|   1 |  5 | 2009-06-26  | 
|   2 |  6 | 2009-04-21  | 
|   2 |  6 | 2009-06-26  | 
|   2 |  7 | 2009-04-20  | 
|   2 |  7 | 2009-04-20  | 
+-----------+---------+------------------+ 

created_at是一個時間字段,但我調用date()來獲取當天。

我有一個「login_days」的概念,它是給定用戶有一個sign_in記錄的不同天數。我想按照登錄日數,最高優先順序排列學校,並返回登錄日數。

因此,看上面的數據,學校1有兩個用戶(4 & 5)。用戶4在3個不同的日子有三個sign_ins,所以3個「login_days」。用戶5有三次登錄,但只有兩個不同的日子,所以2個「login_days」。因此,學校1有5個登錄日。在學校2

來看,它有3天登錄:2的用戶6和1從用戶7.

所以,我想從查詢此回:

+-----------+------------+ 
| school_id | login_days | 
+-----------+------------+ 
|   1 |  5 | 
|   2 |  4 | 
+-----------+------------+ 

我不能完全弄清楚如何做查詢。我開始了與這個(我有ID在那裏< 11部分只是爲了讓我的例子中的數據,而不是我的350萬行整個表):

mysql> select school_id from sign_ins where id < 11 group by school_id, user_id, date(created_at); 
+-----------+ 
| school_id | 
+-----------+ 
|   1 | 
|   1 | 
|   1 | 
|   1 | 
|   1 | 
|   2 | 
|   2 | 
|   2 | 
+-----------+ 
8 rows in set (0.00 sec) 

我可以看到這裏有5行的學校1和3學校2,看起來像它的工作。但是我需要進一步對它進行分組,並按照分組號碼進行排序,以便在我所需的結果中得到它。這一定很簡單,有人能告訴我我失蹤了什麼嗎?

感謝,最大

回答

1

MySQL允許您計算不同值的多個表達式的數量。所以,這基本上是一個聚合查詢與適當的計數:

select school_id, count(distinct user_id, date(created_at)) as NumLoginDays 
from sign_ins 
group by school_id; 
+0

完美,謝謝!我知道這件事很簡單,今天下午我的腦子一片混亂。 – 2015-02-24 15:20:32