【问题标题】:Count where and group by but show the latest id of each group计算位置和分组依据,但显示每个组的最新 id
【发布时间】:2021-10-14 10:33:13
【问题描述】:

我有这样的 chat_notif 表:

id order_id chat_id sent_to
1 order-001 1 2
2 order-002 2 1
3 order-001 3 2
4 order-001 4 2
5 order-002 5 1
6 order-003 6 2
7 order-003 7 2
8 order-003 8 2
9 order-001 9 2
10 order-002 10 1

我需要的是获取计数,但按 order_id 分组,其中 sent_to 为 2:

SELECT *, count(id) as count FROM chat_notif WHERE sent_to=2 GROUP BY order_id
id order_id chat_id sent_to count
1 order-001 1 2 4
6 order-003 6 2 3

从上表来看,计数是正确的。但我需要的是获取每个组的最后一个 id,所以它应该是这样的:

id order_id chat_id sent_to count
9 order-001 9 2 4
8 order-003 8 2 3

那我该怎么做呢?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我们可以使用 MAX 找到最后一个值,并使用它来将这些值聚合到查询中。

    如果我们想在 count() 函数中包含其他字段,我们需要将它们包含在 GROUP BY 中,或者使用其他聚合函数,例如 SUM 或 AVERAGE。

    幸运的是,您提到您只需要每个组的 last id。 MAX 可以很好地用于此目的并算作聚合函数,所以我们很幸运。

    注意,这假定字段“id”和“chat_id”是数字类型,例如整数,以便它们与 MAX 函数一起使用。您可能会遇到其他(非数字)数据类型的问题。

    SELECT MAX(id) as id, order_id, MAX(chat_id) as chat_id, sent_to, count(id) as count 
    FROM chat_notif 
    WHERE sent_to=2 
    GROUP BY order_id;
        
    +------+-----------+---------+---------+-------+
    | id   | order_id  | chat_id | sent_to | count |
    +------+-----------+---------+---------+-------+
    |    9 | order-001 |       9 |       2 |     4 |
    |    8 | order-003 |       8 |       2 |     3 |
    +------+-----------+---------+---------+-------+
    2 rows in set (0.00 sec)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多