在select

时间:2019-03-05 03:53:21

标签: mysql join

我在MySQL数据库中有此选择:

select r.ID, r.ReservationDate, SUM(p.Amount) AS Amount
from Reservations r
join Payments p
on r.ID = p.ReservationID
where r.ConfirmationNumber = '123456'
and p.CCLast4 = '3506'
and r.ID = 54321

它给了我准确的1条记录-正确的记录-符合预期。但是,如果我将CCLast4(3506)更改为我想要的任何旧数字/字符串,我仍然会得到记录,但是Amount为null。我希望根本没有记录,因为where子句不再匹配。如果我按预期更改了ConfirmationNumberID,则没有任何结果。但是CCLast4被完全忽略了。

如果我删除聚合:SUM(p.Amount) AS Amount-一切都很好,并且CCLast4在返回字符串之前要求正确的数字。

我不明白为什么聚合会导致与Payments表(CCLast4列)相关的where子句被忽略。

如何更改查询,以便可以在select AND使用所有where子句的情况下使用聚合?

1 个答案:

答案 0 :(得分:0)

这实际上是预期的行为。来自the manual

  

没有GROUP BY,只有一个组,并且不确定要为该组选择哪个[非汇总列]值。

尽管没有很清楚地说明,但这意味着即使对于一个空表,您总是得到一个组(所以只有一行)。

值得强调的是,MySQL为selectr.IDr.ReservationDate中的非聚合列选择的值实际上是不确定的,并且在整个MySQL中会有所不同版本(例如,对于MySQL 8.0,它们通常为null,而对于早期版本,它们通常包含现有值)。

解决方案同样微妙-添加group by(因此引用的句子不再适用):

...
where r.ConfirmationNumber = '123456'
and p.CCLast4 = 'xxx'
and r.ID = 54321
group by r.ID, r.ReservationDate

应该给您0行。