分组sql查询(mysql) - 按顺序排序

时间:2015-02-24 14:48:23

标签: mysql group-by

让我们说我有一个表sign_ins,其数据如下:(实际表有350万行)

+-----------+---------+------------------+
| 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个不同的日期,所以2“登录日”。因此,学校1有5个登录日。

查看学校2,它有3个登录日:来自用户6的2和来自用户7的1。

所以,我想从查询中得到这个:

+-----------+------------+
| 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)

我可以在这里看到学校1有5行,学校2有3行,看起来很有效。但是我需要进一步分组,并按照该分组编号排序,以便在我所需的结果中得到它。它必须是简单的东西,有人能告诉我我错过了什么吗?

谢谢,Max

1 个答案:

答案 0 :(得分:1)

MySQL允许您计算多个表达式的不同值的数量。所以,这基本上是一个具有适当计数的聚合查询:

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