Невозможно запросить объединение с нулевыми записями - PullRequest
0 голосов
/ 19 февраля 2019

Итак, у меня есть таблица пользователей и таблица заказов.Таблица заказов связана с таблицей пользователей через столбец user_id.Я пытаюсь выполнить запрос, чтобы узнать всех моих пользователей, сколько заказов они разместили, а также общую стоимость заказа.Вот что у меня есть:

select count(orders.id) as order_count, sum(orders.total_cost) as total_spent, CONCAT_WS(", ", `last_name`, `first_name`) AS `customer_name`, users.id as user_id
from users
left join orders on users.id = orders.user_id
where orders.status != 'Canceled'
group by user_id
order by order_count asc

Моя проблема в том, что не возвращаются пользователи, у которых нет записей в таблице заказов.В идеале я хотел бы видеть всех клиентов и отображать 0 (даже ноль будет работать) для пользователей, которые не разместили заказ.Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Это потому, что у вас есть левое соединение, но затем поместите левую таблицу в условие where для создания внутреннего соединения.

Два исправления, поместите условие в соединение:

select count(orders.id) as order_count, sum(orders.total_cost) as total_spent, CONCAT_WS(", ", `last_name`, `first_name`) AS `customer_name`, users.id as user_id
from users
left join orders on users.id = orders.user_id and orders.status != 'Canceled'
group by user_id
order by order_count asc

или тест на ноль

select count(orders.id) as order_count, sum(orders.total_cost) as total_spent, CONCAT_WS(", ", `last_name`, `first_name`) AS `customer_name`, users.id as user_id
from users
left join orders on users.id = orders.user_id
where coalesce(orders.status,'') != 'Canceled'
group by user_id
order by order_count asc
0 голосов
/ 19 февраля 2019

вы почти там, просто вам нужно добавить group by заявление

select 
   count(orders.id) as order_count, 
   sum(orders.total_cost) as total_spent,
   CONCAT_WS(", ", `last_name`, `first_name`) AS `customer_name`, 
   users.id as user_id
from users
left join orders on users.id = orders.user_id and orders.status != 'Canceled'
group by  `customer_name`, user_id

, пожалуйста, обратите внимание, что если вы делаете левое соединение и вам нужно добавить ограничение на левую соединенную таблицу, вам нужно поставитьэто в on пункте.Если вы поместите условие левой стороны в предложение where, левое соединение неявно преобразуется во внутреннее соединение

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