@aljo222
В процессе обучения веб-разработке

Как сделать group by с сохранением некоторым столбцов?

Здравствуйте!
Есть две таблицы: Orders и OrderProducts.

Делаю запрос для получения заказов пользователя и товаров в этом заказе.
SELECT orders.num, orders.createdon, orders.cost, orders.status, products.name, products.count, products.cost
FROM `modx_ms2_orders` AS orders
JOIN `modx_ms2_order_products` AS products ON orders.id = products.order_id
WHERE `user_id` = 106


Результат:
6120cbfd62c7c761237879.jpeg

Num - это номер заказа. Можно ли как-то объединить строки по столбцу num, при этом не удаляя повторяющиеся последние столбцы ProductName, ProductCount, ProductCost.

Т.е. в итоге хочу получить для каждого заказа по одной строке, в которой могут повторяться поля ProductName, ProductCount, ProductCost для каждого товара.

Заранее спасибо за подсказки!
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
rozhnev
@rozhnev Куратор тега MySQL
Fullstack programmer, DBA, медленно, дорого
Простейший варниант - использовать GROUP_CONCAT
SELECT
    orders.num, orders.createdon, orders.cost, orders.status, 
   GROUP_CONCAT(products.name) prod_names, 
   GROUP_CONCAT(products.count) prod_counts, 
   GROUP_CONCAT(products.cost) prod_costs
FROM `modx_ms2_orders` AS orders
JOIN `modx_ms2_order_products` AS products ON orders.id = products.order_id
WHERE `user_id` = 106
GROUP BY orders.num, orders.createdon, orders.cost, orders.status
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Нет. Вы не сможете сделать выборку с произвольным количеством полей.
Максимум, что тут можно сделать, - свернуть эти поля в JSON.
SELECT `o`.`num`, `o`.`createdon`, `o`.`cost`, `o`.`status`, `p`.`products`
  FROM `modx_ms2_orders` AS `o`
  LEFT JOIN (
    SELECT `order_id`,
           JSON_ARRAYAGG(
             JSON_OBJECT('name', `name`, 'price', `price`, 'count', `count`)
           ) AS `products`
      FROM `modx_ms2_order_products` 
      GROUP BY `order_id`
  ) AS `p` ON `p`.`order_id` = `o`.`id`
  WHERE `o`.`user_id` = 106
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы