Мне нужны пустые поля в многотабличном запросе - ЗАКРЫТО

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

У меня есть база данных с 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.

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

Совет сегодня: всегда используйте современный, явный синтаксис JOIN. Легче писать (без ошибок), легче читать и поддерживать, и при необходимости легче преобразовать во внешнее соединение!

jarlh 13.01.2019 21:14
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
1
41
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Никогда используйте запятые в предложении 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

Giannis 13.01.2019 21:29
Ответ принят как подходящий

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

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 13.01.2019 21:23

@Giannis. ответ обновлен .. верните 3 строки также нулевые значения 3rdwit db-fiddle.com/f/ujcc7eVvQtB7SPLt6FmBPR/0

ScaisEdge 13.01.2019 21:28

Спасибо, это работает. Теперь мне нужно заняться JOINS, чтобы я мог понять, что они делают :) Еще раз спасибо за ваше время.

Giannis 13.01.2019 22:01

Я рекомендую вам использовать 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;

Спасибо за ссылку, проверю

Giannis 13.01.2019 21:24

Другие вопросы по теме

Список всех привилегий на уровне таблиц и столбцов для базы данных MySQL
Импорт таблицы из CSV в схему занимает слишком много времени в mysql WorkBench
Попытка суммировать псевдонимы для заголовков столбцов с использованием общих табличных выражений
Сообщения Wordpress отображаются в базе данных SQL, но не отображаются на панели инструментов My wp-admin
Выбор данных по неделям с помощью (неделя = текущая отметка времени - 7 дней) и т. д. В db2
Ошибка преобразования при преобразовании из символьной строки в уникальный идентификатор sql
Запрос MySQL для объединения трех таблиц и получения данных из 2-й и 3-й таблиц
ASP.NET C# FileUpload внутри UpdatePanel с обратной передачей
Как мне обновить TABLE1 значениями из TABLE2 без установки столбцов из TABLE1 для конкретных, отдельных операторов выбора?
Что не так с моим кодом? У меня возникла ошибка при вызове неопределенного метода mysqli :: error ()