gpt4 book ai didi

mysql - select 中使用聚合时,where 子句不限制记录

转载 作者:行者123 更新时间:2023-11-29 16:14:03 24 4
gpt4 key购买 nike

我的 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 为空。我希望根本没有记录,因为 where 子句不再匹配。如果我更改 ConfirmationNumberID,正如预期的那样,我不会返回任何结果。但 CCLast4 被完全忽略。

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

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

如何更改查询,以便可以在 select 中使用聚合并遵守所有 where 子句?

最佳答案

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

Without GROUP BY, there is a single group and it is nondeterministic which [non-aggregated column] value to choose for the group.

尽管没有非常明确地说明,但这意味着您始终会得到一个组(因此一行),即使对于空表也是如此。

还值得强调的是,MySQL 在 selectr.IDr.ReservationDate 中为非聚合列选择的值code> 实际上是不确定的,并且会因 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 行。

关于mysql - select 中使用聚合时,where 子句不限制记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54995155/

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