Добрый день.
Помогите, пожалуйста, разобраться с такой непоняткой.
Есть запрос N1:
SELECT COUNT(*)
FROM `users_tmp` AS u
LEFT JOIN `orders` AS o ON u.`id` = o.`user_id`
WHERE (o.`status` = 'PROCESSED') AND (o.`refunded` = 0) AND
(DATE(o.`created_at`) BETWEEN DATE('2023-10-01') AND DATE('2023-10-31'))
И запрос N2:
SELECT COUNT(*)
FROM `users_tmp` AS u
LEFT JOIN (SELECT * FROM `orders` AS o
WHERE (o.`status` = 'PROCESSED') AND (o.`refunded` = 0) AND
(DATE(o.`created_at`) BETWEEN DATE('2023-10-01') AND DATE('2023-10-31'))
) AS o
ON u.`id` = o.`user_id`
Просто для информации - в таблице `users_tmp` порядка 75000 записей, в таблице `orders` порядка 200000 записей, отвечающим условиям фильтра WHERE.
Так вот, первый запрос возвращает порядка 6000 записей (правильное количество записей, которые отвечают условиям фильтра WHERE и принадлежат пользователям из таблицы `users_tmp`), а второй запрос - порядка 76000!?
Если фильтр WHERE убрать, то оба запроса возвращают одинаковое количество записей (порядка 273000).
Чем отличаются оба запроса и почему фильтр так влияет на правильность выполнения второго запроса.
Если я правильно понимаю, то в первом запросе для каждого пользователя из таблицы `users_tmp` выбираются его заказы и потом к ним применяется фильтр WHERE.
Во втором запросе для каждого пользователя из таблицы `users_tmp` производится сначала выборка всех заказов, отвечающих фильтру WHERE, из которых потом выбираются только его заказы.