0

我需要运行一个 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,发生了两个动作。第一个动作添加了 foo ,第二个动作删除了它。我理想的 Group 函数将只返回由创建的字段确定的最新操作。

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

4

3 回答 3

1

有几种方法可以获得所需的输出。它被称为组明智最大值。这些都列在这里

大多数人使用peterm提到的方法。

于 2013-08-05T03:54:53.553 回答
1

您可以先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;

输出:

| 身份证 | FOO_ID | BAR_ID | 行动 | 创建 |
-------------------------------------------------- ------
| 3 | 9784 | 18 | 添加 | 2013-02-15 07:34:23 |
| 4 | 17980 | 18 | 删除 | 2013-03-12 07:34:23 |

这是SQLFiddle演示

于 2013-08-05T02:35:38.943 回答
1

您可以使用一个group_concat()技巧来获取此信息:

select substring_index(group_concat(id order by created desc), ',', 1) as id,
       foo_id, max(created) as MostRrecentCreated,
       substring_index(group_concat(bar_id order by created desc), ',', 1) as bar_id,
       substring_index(group_concat(action order by created desc), ',', 1) as action
from table
group by foo_id;

两个笔记。这会将使用逻辑的字段转换为字符串,因此如果您希望它们为另一种类型,则需要将它们转换回来。其次,它假定action不包含任何逗号。

于 2013-08-05T02:49:09.067 回答