mysql - 在 MySQL Group 函数中排序

标签 mysql group-by

我需要运行一个 Group 函数,其中的结果在函数内明确排序。这是表结构的示例(以及伪造的数据)

id (int) | foo_id (int) | bar_id (int) | action (enum) | created (datetime)
1        | 17980        | 18           | added         | 2012-12-03 07:34:23
2        | 14321        | 17           | added         | 2013-01-06 07:34:23
3        | 9784         | 18           | added         | 2013-02-15 07:34:23
4        | 17980        | 18           | removed       | 2013-03-12 07:34:23
etc.

我想知道每个 foo_id 的最近操作。理想情况下我会运行这样的东西:

SELECT * FROM table WHERE bar_id = 18 GROUP BY foo_id ORDER BY created;

理想的结果是:

id | foo_id | bar_id | action  | created
3  | 9784   | 18     | added   | 2013-02-15 07:34:23
4  | 17980  | 18     | removed | 2013-03-12 07:34:23

对于 foo_id = 17980,发生了两个 Action 。第一个操作添加了 foo,第二个操作删除了它。我理想的 Group 函数将只返回最近的操作,这由创建的字段决定。

据我所知,Group 函数不接受订单参数。有没有办法做到这一点?感谢您的帮助。

最佳答案

您可以先GROUP BY foo_id 并获取MAX(created) 以获得每个foo_id 的最新日期,然后 JOIN 回到您的表以获取这些值的所有其他列

SELECT * 
  FROM table1 t JOIN
(
  SELECT foo_id, MAX(created) created
    FROM Table1
   WHERE bar_id = 18
   GROUP BY foo_id
) q ON t.foo_id = q.foo_id 
   AND t.created = q.created
 ORDER BY t.created;

输出:

| ID | FOO_ID | BAR_ID |  ACTION |             CREATED |
--------------------------------------------------------
|  3 |   9784 |     18 |   added | 2013-02-15 07:34:23 |
|  4 |  17980 |     18 | removed | 2013-03-12 07:34:23 |

这是 SQLFiddle 演示

关于mysql - 在 MySQL Group 函数中排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18049828/

相关文章:

sql - 如何在 SWIFT 的 IOS CORE-DATA 请求中使用 SQL GROUP BY 和 SUM 函数?

arrays - Elasticsearch:当字段是数组时如何按字段分组文档

php - 使用 Php 从 MySQL 数据库获取 URL

mysql - 如果不存在则插入或更新

mysql - 当某些记录有月/日/年而其他记录只有年份时如何存储日期?

sql - 包含带 OR 条件的分组规则的 GROUP BY 优化

mysql - 在分布式系统中终止 session 的正确方法

php - 如何在 while 循环中从 mysqli_fetch_array() 检索当前和下一个元素?

sql - Oracle SQL 条件求和

mysql - 有没有一种方法可以使用一列进行分组,但对于给定的组来说它可以等于一组值?