Мне нужны пустые поля в многопользовательском запросе - ЗАКРЫТО - PullRequest
0 голосов
/ 13 января 2019

Это должно быть легко для вас, но я потерялся здесь:

У меня есть база данных с 4 таблицами: заказы, клиенты, продукты, orders_products

Мне нужно выбрать всех клиентов со всеми их заказами, , включая тех, у которых нет заказов.

Я получаю только тех, кто сделал заказ. Бедный старый «Ник» в таблице «Клиенты» не появится.

Что я здесь не так делаю?

SELECT c.name clientname, o.id orderID, GROUP_CONCAT(p.name) productNAMEs,
    GROUP_CONCAT(p.id) productIDs
FROM clients c, orders o, orders_products op, products p
WHERE c.id = o.client_id
AND c.status = 1
AND o.id = op.order_id
AND p.id = op.product_id
GROUP BY c.name

См. Определения таблиц здесь: https://www.db -fiddle.com / ж / bTRSLfYTa19S2EpE2zKwUv / 7

Спасибо за ваше время.

ОБНОВЛЕНИЕ: @scaisedge предложил ответ, включающий клиентов без заказов:

SELECT c.name clientname, o.id orderID, GROUP_CONCAT(p.name) productNAMEs, 
GROUP_CONCAT(p.id) productIDs
FROM clients c
LEFT JOIN  orders o ON c.id = o.client_id
LEFT  JOIN  orders_products op ON o.id = op.order_id
LEFT  JOIN  products p  ON p.id = op.product_id  
WHERE c.status = 1
GROUP BY c.name

Вы можете увидеть результаты здесь: https://www.db -fiddle.com / f / 8bGcQJSbSFmKMUo1tLuZuA / 1

Кажется, я не использовал JOIN'ы.

Еще раз спасибо всем за ваше время.

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Использовать явный синтаксис объединения и левое соединение для получения, а также строки, которые не совпадают

SELECT c.name clientname, o.id orderID, GROUP_CONCAT(p.name) productNAMEs, 
GROUP_CONCAT(p.id) productIDs
FROM clients c
LEFT JOIN  orders o ON c.id = o.client_id
LEFT  JOIN  orders_products op ON o.id = op.order_id
LEFT  JOIN  products p  ON p.id = op.product_id  
WHERE c.status = 1
GROUP BY c.name
0 голосов
/ 13 января 2019

Я рекомендую вам использовать JOIN для объединения данных таблиц. Предложение JOIN используется для объединения строк из двух или более таблиц на основе связанного столбца между ними.

https://www.w3schools.com/sql/sql_join.asp

SELECT *
FROM clients LEFT JOIN orders ON clients.id = orders.client_id
     LEFT JOIN orders_products ON clients.id = orders_products.order_id 
     LEFT JOIN products ON products.id = orders_products.product_id
WHERE clients.status = 1;
0 голосов
/ 13 января 2019

Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.

Кроме того, ваш GROUP BY должен соответствовать неагрегированным столбцам в SELECT.

Я не уверен, что вы намереваетесь это сделать:

SELECT c.name as clientname, o.id as orderID,        
       GROUP_CONCAT(p.name) as productNAMEs,
       GROUP_CONCAT(p.id) productIDs
FROM clients c left join
     orders o
     on c.id = o.client_id left join
     orders_products op
     on o.id = op.order_id left join
     products p
     on p.id = op.product_id
WHERE c.status = 1
GROUP BY c.name, o.id;

Или:

SELECT c.name as clientname,      
       GROUP_CONCAT(p.name) as productNAMEs,
       GROUP_CONCAT(p.id) productIDs
FROM clients c left join
     orders o
     on c.id = o.client_id left join
     orders_products op
     on o.id = op.order_id left join
     products p
     on p.id = op.product_id
WHERE c.status = 1
GROUP BY c.name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...