gpt4 book ai didi

mysql - 相同的查询返回不同的结果(MySQL Group By)

转载 作者:行者123 更新时间:2023-11-29 07:13:40 25 4
gpt4 key购买 nike

这只发生在ORDER BY之后强制使用GROUP BY的查询。

目标:

获取给定cardID的每个单位最新余额

表格:

cardID  |  unit     |  balance  |  date
--------|-----------|-----------|--------------
A1 | DEPOSIT | 100 | 2016-05-01
A1 | DEPOSIT | 90 | 2016-05-02
A1 | DEPOSIT | 80 | 2016-05-03
A1 | DEPOSIT | 75 | 2016-05-04
A1 | MINUTE | 1000 | 2016-05-01
A1 | MINUTE | 900 | 2016-05-02
A1 | MINUTE | 800 | 2016-05-03

查询:

SELECT * FROM (
SELECT unit, balance
FROM cardBalances
WHERE cardID = 'A1'
ORDER BY date DESC
) AS cb
GROUP BY cb.unit;

预期结果(MySQL v5.5.38):

unit     |  balance  
---------|-----------
DEPOSIT | 75
MINUTE | 800

意外结果(MySQL v5.7.13):

unit     |  balance
---------|-----------
DEPOSIT | 100
MINUTE | 1000

升级到MySQL v5.7.13后,结果返回初始余额;就像给定的卡没有发生扣除一样。

这是 MySQL 版本的错误吗?
您能建议任何其他更可靠的方法来解决这个问题吗?

最佳答案

这是您使用数据库时出现的错误。 MySQL 非常明确地表明,当您在聚合查询的 SELECT 子句中包含列时(并且它们不在 GROUP BY 中),那么它们来自不确定的行。

这种语法是 MySQL 特有的。学习这不仅是一个坏主意,而且它通常在其他数据库中不起作用。

您可以通过多种方式做您想做的事。这是其中之一:

SELECT cb.*
FROM cardBalances cb
WHERE cardId = 'A1' AND
cb.date = (SELECT MAX(date)
FROM cardBalances cb2
WHERE cb2.cardId = 'A1' AND cb2.unit = cb.unit
);

这样做的优点是可以使用 cardBalances(unit, CardId, date) 上的索引。

关于mysql - 相同的查询返回不同的结果(MySQL Group By),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38719922/

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