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

奥努尔·耶尔迪里姆

只有GROUP BY在之后强制执行的查询才会发生这种情况ORDER BY

目标:

为给定的每个获取最新 balanceunitcardID

桌子:

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版本中的错误吗?
您会提出其他更可靠的方法来解决此问题吗?

戈登·利诺夫(Gordon Linoff)

这是您使用数据库时的错误。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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章