@sashok1337

Группировка строк с двух LEFT JOIN таблиц без подзапроса?

Добрый вечер уважаемое сообщество! Допустим есть такая база:

Таблица users
|_______ id
|_______ name

Таблица orders
|_______ id
|_______ user_id
|_______ amount

Таблица order_items
|_______ id
|_______ order_id
|_______ product_id
|_______ qty

Задача стоит следующая - без подзапросов для всех пользователей вывести общую сумму заказов и общее кол-во купленных товаров (т.е. SUM(order_items.qty)).

Для первого условия всё просто:
SELECT 
    u.name, 
    IFNULL(SUM(o.amount), 0) AS full_amount
FROM 
    `users` u
LEFT JOIN 
    `orders` o ON u.id = o.user_id
GROUP BY 
    u.id


Для полного решения должно быть что-то такое:
SELECT 
    u.name,
    IFNULL(SUM(o.amount), 0) AS full_amount,
    IFNULL(SUM(i.qty), 0) AS full_quantity
FROM 
    `users` u
LEFT JOIN 
    `orders` o ON u.id = o.user_id
LEFT JOIN 
    `order_items` i ON i.order_id = o.id
GROUP BY 
    u.id


В таком варианте full_quantity считается правильно, а full_amount нет, т.к., насколько я понимаю, таблица order_items не группируется при подсчёте, и выдаёт строки с одинаковыми данными из orders но разными из order_items.

Собственно вопрос - какие есть варианты корректного решения данной задачи?
Заранее благодарен!

P.S.: С профессиональным праздником! :)
  • Вопрос задан
  • 1090 просмотров
Решения вопроса 1
idShura
@idShura
Последний вариант оформил в виде ответа.
SELECT u.id,
             u.name, 
             IFNULL(SUM(o.amount), 0) AS full_amount,
             SUM((SELECT FNULL(SUM(i.qty), 0) FROM `order_items` i where i.order_id = o.id )) full_quantity
FROM `users` u
LEFT JOIN `orders` o ON u.id = o.user_id
--Where кучей фильтров(условий)
GROUP BY u.id, u.name
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы