【问题标题】:grouped sql query (mysql) - order by分组 sql 查询 (mysql) - 排序依据
【发布时间】:2026-02-07 13:35:01
【问题描述】:

假设我有一个表 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”的概念,它是给定用户拥有登录记录的不同天数。我想按登录天数排序学校,从高到低,返回登录天数。

因此,查看上面的数据,学校 1 有两个用户(4 和 5)。用户 4 在 3 个不同的日子有 3 个登录,因此 3 个“登录天”。用户 5 有 3 次登录,但只有 2 天不同的登录,所以 2“login_days”。因此学校 1 有 5 个登录日。

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

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

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

我不太清楚如何进行查询。我从这个开始(我有 id

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 group-by


    【解决方案1】:

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

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

    【讨论】:

    • 完美,谢谢!我知道这很简单,只是今天下午我脑子里想不通。