无聚合而非限制的MySQL分组

无聚合而非限制的MySQL分组,mysql,sql,group-by,aggregate-functions,limit,Mysql,Sql,Group By,Aggregate Functions,Limit,场景:假设我有一个事务表,我只需要每个用户的最后一个事务的详细信息 因此,在下面的示例中,我希望得到以下结果: | userId | trxType | trxDate | |--------|---------|----------| | 1 | c | 20190103 | | 2 | a | 20190104 | 我知道这不是一个好的解决方案,但我是否可以安全地假设在有序的子查询上使用不带聚合的GROUP BY将在这种情况下返回正确的数据(即

场景:假设我有一个事务表,我只需要每个用户的最后一个事务的详细信息

因此,在下面的示例中,我希望得到以下结果:

| userId | trxType | trxDate  |
|--------|---------|----------|
| 1      | c       | 20190103 |
| 2      | a       | 20190104 |
我知道这不是一个好的解决方案,但我是否可以安全地假设在有序的子查询上使用不带聚合的GROUP BY将在这种情况下返回正确的数据(即从每个组的第一列中选择字段)

我尝试了下面的测试,似乎效果不错,但我读过一些帖子,说它们是随机选择的(工会是为了模拟一个表来进行独立查询)

谢谢

使现代化 正如我所说,我知道这是一个糟糕的解决方案,不应该使用。我只是想知道未聚合的GROUP BY是否会选择它遇到的第一个项目

无论如何,如果您正在寻找最佳解决方案,我发现这很有用,而且很干净,因为它允许非唯一的排序字段,如果您想要超过1条,还允许每组前N条记录(只需编辑最终条件):


IMP:始终首先按分组字段排序)

您可以为此使用相关子查询:

select t.*
from transactions t
where t.trxDate = (select max(t2.trxDate)
                   from transactions t2
                   where t2.userid = t.userid
                  );

为了提高性能,您需要在
事务(userid,trxDate)

上建立索引。永远不要这样做,结果是不可预测的。如果要聚合和/或分组,则需要聚合或分组查询中的每一列。谢谢。此解决方案的问题在于排序字段不是唯一的。我在这个问题上加了一个更好的答案。
SELECT x.userid, x.trxType, x.trxDate
FROM (
    SELECT t.userid, t.trxType, t.trxDate,
    @group_order := IF(@current_group = t.userid, @group_order + 1, 1) as group_order,
    @current_group := t.userid as current_group
    FROM transactions t
    ORDER by t.userid, t.trxDate DESC
) x
WHERE x.group_order = 1;
select t.*
from transactions t
where t.trxDate = (select max(t2.trxDate)
                   from transactions t2
                   where t2.userid = t.userid
                  );