我在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子句不再匹配。如果我按预期更改了ConfirmationNumber
或ID
,则没有任何结果。但是CCLast4
被完全忽略了。
如果我删除聚合:SUM(p.Amount) AS Amount
-一切都很好,并且CCLast4
在返回字符串之前要求正确的数字。
我不明白为什么聚合会导致与Payments
表(CCLast4
列)相关的where子句被忽略。
如何更改查询,以便可以在select AND使用所有where子句的情况下使用聚合?
答案 0 :(得分:0)
这实际上是预期的行为。来自the manual:
没有GROUP BY,只有一个组,并且不确定要为该组选择哪个[非汇总列]值。
尽管没有很清楚地说明,但这意味着即使对于一个空表,您总是得到一个组(所以只有一行)。
值得强调的是,MySQL为select
,r.ID
和r.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行。