@bigtrouble

Как выбрать элементы, для которых нет записей на текущий момент в бд?

Добрый день, возможно заголовок не полно отображает суть вопроса, так что буду рад если кто исправит.
К примеру, есть табличка пользователей и их заказов
Users
id_user | name | ...
500 | Jack | ...
501 | Nick | ....
Orders
id_order | id_user | .... | date | ....
1052 | 500 | .... | 2015-02-23 | ....
1053 | 500 | .... | 2015-02-23 | ....

Так вот, нужно выбрать количество заказов у каждого пользователя за прошлый месяц, выходит примерно такой запрос
SELECT `users`.`id_user`, count(`orders`.`id_order`) as `sum_orders`
FROM `users`
JOIN `orders` ON (`users`.`id_user` = `orders`.`id_user`)

WHERE `orders`.`date` >= '2015-02-01 00:00:00' AND `orders`.`date` < '2015-03-01 00:00:00' 
group by `users`.`id_user`

Кажется, что всё круто и задача выполнена, но тут возникает проблема что пользователи у которых вообще не было заказов не отображаются в этом списке(и это понятно почему, т.к. во 2 месяце у них заказов и не было). Как переделать запрос таким образом, чтобы включались и id пользователей с нулевыми значениями?

Да возможный вариант решения - выбрать пользователей с заказами, выбрать всех пользователей и откинуть пользователей с заказами от всех и получить пользователей с нулевыми заказами, но тут другая проблема возникает, если к примеру накладываем условие на выбор пользователей у которых меньше заданного числа заказов, например добавим
having `sum_orders` < 15

то вариант с откидыванием таких пользователей уже становится проблемным.

Есть так же вариант доставать всех пользователей из бд и для каждого пробовать достать заказы, но здесь уже слишком много запросов получается.

В общем повторюсь по первоначальному селекту - Как переделать запрос таким образом, чтобы включались и id пользователей с нулевыми значениями?
  • Вопрос задан
  • 2368 просмотров
Решения вопроса 1
Использовать LEFT JOIN?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы