gpt4 book ai didi

MySQL GROUP BY 不带聚合而不是 LIMIT

转载 作者:行者123 更新时间:2023-11-29 09:34:26 26 4
gpt4 key购买 nike

场景:假设我有一个交易表,并且我只想要每个用户的最后一笔交易的详细信息。

So, in the example below I want this result:

| userId | trxType | trxDate  |
|--------|---------|----------|
| 1 | c | 20190103 |
| 2 | a | 20190104 |

我知道这不是一个好的解决方案,但是我可以安全地假设在有序子查询上使用没有聚合的GROUP BY,在这种情况下会返回正确的数据(即.从每个组的第一列中选​​择字段)?

我尝试了以下测试,它似乎工作正常,但我读过一些帖子,说它们是随机选择的 Ø_Ø(联合是用来模仿表来进行独立查询的)。

SELECT userid, trxType, trxDate
FROM (
SELECT *
FROM (
SELECT 1 AS userid, 'a' AS trxType, '20190101' AS trxDate
UNION
SELECT 1 AS userid, 'b' AS trxType, '20190102' AS trxDate
UNION
SELECT 1 AS userid, 'c' AS trxType, '20190103' AS trxDate
UNION
SELECT 2 AS userid, 'a' AS trxType, '20190104' AS trxDate
UNION
SELECT 2 AS userid, 'b' AS trxType, '20190101' AS trxDate
) myTable ORDER BY trxDate DESC
) mySubQuery
GROUP BY userid;

谢谢!

更新

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

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

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;

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

最佳答案

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

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

为了提高性能,您需要在transactions(userid, trxDate)上建立索引。

关于MySQL GROUP BY 不带聚合而不是 LIMIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57977613/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com