Продуктовые линейки клиента онлайн урок.


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

customers c
JOIN orders o ON c.id = o.customer_id
JOIN order_details od ON od.order_id = o.id
JOIN products p ON p.id = od.product_id
JOIN product_lines pl ON pl.id = p.product_line_id

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

Попробуем вывести идентификатор клиента и линейки продуктов:

SELECT c.id client_id, c.name as client, pl.name
FROM customers c
JOIN orders o ON c.id = o.customer_id
JOIN order_details od ON od.order_id = o.id
JOIN products p ON p.id = od.product_id
JOIN product_lines pl ON pl.id = p.product_line_id

Все будет работать, но у нас будет много повторений, т.к. в соединении у нас связи один ко многим и многие ко многим, что ведет к дублированию значений во всех столбцах. Мы бы хотели получить строки с разными клиентами. Но для этого необходимо будет сгруппировать значения продуктовых линеек в одной строке. Для этого используется агрегатная функция GROUP_CONCAT(), которая возвращает строку из сгруппированных значений, записанных через запятую. Используем эту функцию, сгруппировав строки по идентификатору клиента:

SELECT c.id client_id, c.name as client, GROUP_CONCAT(pl.name)
FROM customers c
JOIN orders o ON c.id = o.customer_id
JOIN order_details od ON od.order_id = o.id
JOIN products p ON p.id = od.product_id
JOIN product_lines pl ON pl.id = p.product_line_id
GROUP BY c.id

Это почти то, что нам надо. Осталось убрать дубли в ячейках со списком продуктовых линеек. Для этого используем оператор DISTINCT в функции GROUP_CONCAT():

SELECT c.id client_id, c.name as client, GROUP_CONCAT(DISTINCT pl.name)
FROM customers c
JOIN orders o ON c.id = o.customer_id
JOIN order_details od ON od.order_id = o.id
JOIN products p ON p.id = od.product_id
JOIN product_lines pl ON pl.id = p.product_line_id
GROUP BY c.id


+-----------+------------------------------------+----------------------------------------------------------------------------+
| client_id | client | GROUP_CONCAT(DISTINCT pl.name) |
+-----------+------------------------------------+----------------------------------------------------------------------------+
| 1 | Atelier graphique | Classic Cars,Vintage Cars,Motorcycles |
| 2 | Signal Gift Stores | Classic Cars,Vintage Cars |
| 3 | Australian Collectors, Co. | Vintage Cars,Motorcycles,Trucks and Buses,Classic Cars,Planes |
| 4 | La Rochelle Gifts | Ships,Motorcycles,Planes,Classic Cars,Trucks and Buses,Vintage Cars |
| 5 | Baane Mini Imports | Vintage Cars,Classic Cars,Trains,Motorcycles,Trucks and Buses |
| 6 | Mini Gifts Distributors Ltd. | Motorcycles,Trucks and Buses,Vintage Cars,Classic Cars,Trains,Ships |
| 8 | Blauer See Auto, Co. | Vintage Cars,Classic Cars,Trains,Trucks and Buses |
| 9 | Mini Wheels Co. | Vintage Cars,Trucks and Buses,Motorcycles,Classic Cars |
| 10 | Land of Toys Inc. | Ships,Motorcycles,Vintage Cars,Trucks and Buses,Trains,Classic Cars,Planes |
| 11 | Euro+ Shopping Channel | Ships,Motorcycles,Vintage Cars,Planes,Classic Cars,Trucks and Buses,Trains |