我需要运行一个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函数不接受订单参数。有没有办法做到这一点?谢谢你的帮助。
答案 0 :(得分: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;
输出:
| 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 演示
答案 1 :(得分: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
不包含任何逗号。
答案 2 :(得分:1)
有多种方法可以获得所需的输出。它被称为组最大值。列出here。
大多数人都使用peterm提到的方法。