Где предложение не ограничивает записи, когда агрегат используется в select - PullRequest
0 голосов
/ 05 марта 2019

У меня есть этот выбор в моей базе данных 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 больше не соответствует.Если я изменю ConfirmationNumber или ID, как и ожидалось, я не получу никаких результатов.Но CCLast4 полностью игнорируется.

Если я удаляю агрегат: SUM(p.Amount) AS Amount - все хорошо, и CCLast4 требует правильное число перед возвратом строки.

Iне понимаю, почему агрегат приводит к тому, что предложение where, связанное с таблицей Payments (столбец CCLast4), игнорируется.

Как изменить запрос, чтобы использовать агрегатв select и все пункты where соблюдаются?

1 Ответ

0 голосов
/ 05 марта 2019

Это на самом деле ожидаемое поведение.Начиная с руководство :

Без GROUP BY существует одна группа, и не определено, какое значение [неагрегированный столбец] выбрать для группы.

Хотя это не очень четко указано, это означает, что вы всегда получаете одну группу (то есть одну строку), даже для пустой таблицы.

Стоит также подчеркнуть, чтозначения, которые MySQL выбирает для неагрегированных столбцов в select, r.ID и r.ReservationDate, на самом деле являются недетерминированными и будут конкретно различаться в разных версиях MySQL (например, они обычно будут null для MySQL 8.0, хотя они будутобычно содержат существующие значения для более ранних версий).

Решение аналогично тонкое - добавьте group by (чтобы приведенное предложение больше не применимо):

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

должно дать вам 0строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...