分组 sql 查询 (mysql) - 排序依据
grouped sql query (mysql) - order by
假设我有一个 table sign_ins 有这样的数据:(真正的 table 有 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 记录的不同天数。我想按登录天数排序学校,最高的在前,然后 return 登录天数。
因此,查看上面的数据,学校 1 有两个用户(4 和 5)。用户 4 在 3 个不同的日子里有三个 sign_ins,所以 3 "login_days"。用户 5 有 3 次登录,但只有 2 天不同,所以 2 "login_days"。因此学校1有5个登录日。
查看学校 2,它有 3 个登录日:用户 6 登录 2 天,用户 7 登录 1 天。
所以,我想从查询中得到这个:
+-----------+------------+
| school_id | login_days |
+-----------+------------+
| 1 | 5 |
| 2 | 4 |
+-----------+------------+
我不太明白如何进行查询。我从这个开始(我有 id < 11 部分只是为了获取我的示例数据而不是我的整个 table 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 行,这看起来有效。但我需要进一步分组,并按分组的数字排序,才能像我需要的结果那样得到它。它一定很简单,有人可以告诉我我缺少什么吗?
谢谢,麦克斯
MySQL 允许您计算多个表达式的不同值的数量。所以,这基本上是一个具有适当计数的聚合查询:
select school_id, count(distinct user_id, date(created_at)) as NumLoginDays
from sign_ins
group by school_id;
假设我有一个 table sign_ins 有这样的数据:(真正的 table 有 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 记录的不同天数。我想按登录天数排序学校,最高的在前,然后 return 登录天数。
因此,查看上面的数据,学校 1 有两个用户(4 和 5)。用户 4 在 3 个不同的日子里有三个 sign_ins,所以 3 "login_days"。用户 5 有 3 次登录,但只有 2 天不同,所以 2 "login_days"。因此学校1有5个登录日。
查看学校 2,它有 3 个登录日:用户 6 登录 2 天,用户 7 登录 1 天。
所以,我想从查询中得到这个:
+-----------+------------+
| school_id | login_days |
+-----------+------------+
| 1 | 5 |
| 2 | 4 |
+-----------+------------+
我不太明白如何进行查询。我从这个开始(我有 id < 11 部分只是为了获取我的示例数据而不是我的整个 table 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 行,这看起来有效。但我需要进一步分组,并按分组的数字排序,才能像我需要的结果那样得到它。它一定很简单,有人可以告诉我我缺少什么吗?
谢谢,麦克斯
MySQL 允许您计算多个表达式的不同值的数量。所以,这基本上是一个具有适当计数的聚合查询:
select school_id, count(distinct user_id, date(created_at)) as NumLoginDays
from sign_ins
group by school_id;