Это должно быть легко для вас, но я потерялся здесь:
У меня есть база данных с 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/f/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.
Еще раз спасибо всем за ваше время.






Никогда используйте запятые в предложении 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;
Спасибо за помощь, я получаю сообщение об ошибке в предложенном коде: db-fiddle.com/f/gZYKsLPpiKJ9hHveSs57Eq/1
Используйте явный синтаксис соединения и левое соединение для получения также несоответствующей строки
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
Я новый пользователь SQL, поэтому мне нужно будет узнать о JOINS :) Но ваш код не возвращает клиента Nick, так что это не то решение, которое мне нужно: db-fiddle.com/f/ujcc7eVvQtB7SPLt6FmBPR/0
@Giannis. ответ обновлен .. верните 3 строки также нулевые значения 3rdwit db-fiddle.com/f/ujcc7eVvQtB7SPLt6FmBPR/0
Спасибо, это работает. Теперь мне нужно заняться JOINS, чтобы я мог понять, что они делают :) Еще раз спасибо за ваше время.
Я рекомендую вам использовать 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;
Спасибо за ссылку, проверю
Совет сегодня: всегда используйте современный, явный синтаксис
JOIN. Легче писать (без ошибок), легче читать и поддерживать, и при необходимости легче преобразовать во внешнее соединение!