SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.11.2023 19:09:59

OlegR
Участник
Зарегистрирован: 14.06.2022
Сообщений: 21

Непонятки с LEFT JOIN

Добрый день.

Помогите, пожалуйста, разобраться с такой непоняткой.

Есть запрос 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, из которых потом выбираются только его заказы.

Неактивен

 

#2 25.11.2023 19:32:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Непонятки с LEFT JOIN

Потому, что первый запрос работает как JOIN, а второй как LEFT JOIN.

FROM `users_tmp` AS u
LEFT JOIN `orders` AS o ON u.`id` = o.`user_id`
Выбирает всех пользователей, даже если у нет нет заказов.
Применение после этого вашего фильтра WHERE отсечет тех пользователей, у которых нет заказов.

Активен

 

#3 25.11.2023 21:14:04

OlegR
Участник
Зарегистрирован: 14.06.2022
Сообщений: 21

Re: Непонятки с LEFT JOIN

Блин, тупанул!

Спасибо!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson