只有GROUP BY
在之后强制执行的查询才会发生这种情况ORDER BY
。
为给定的每个获取最新 的。balance
unit
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;
unit | balance
---------|-----------
DEPOSIT | 75
MINUTE | 800
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)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句