Использование grouby и sum в запросе - PullRequest
0 голосов
/ 01 мая 2018

У меня довольно большой запрос, и я пытаюсь получить сумму в столбце orders.price. С кодом ниже он возвращает только 44,00, что является ценой для первого ряда. Когда я запускаю необработанный SQL, он возвращает столбец с 1000+ строками цен в столбце с именем «AGGREGATE». Я хочу вернуть единую сумму по всем этим ценам.

Когда я удаляю группу, она работает в основном нормально. Тем не менее, там есть группа, так как мне кажется, что я получаю повторяющиеся строки.

$query = Order::leftJoin('customers', 'orders.customer_id', '=', 'customers.customer_id')
    ->leftJoin('addresses', 'orders.order_id', '=', 'addresses.order_id')
    ->where('orders.customer_id', '!=', 0);

$query->whereIn('user_id', [3, 5, 10, 15]);

$query->groupBy('orders.order_id');

$sum = $query->sum('orders.price');

Я опустил часть кода здесь, но объединения действительно необходимы.

Вот сгенерированный SQL:

SELECT
    sum(`orders`.`price`) AS AGGREGATE
FROM
    `orders`
LEFT JOIN `customers` ON `orders`.`customer_id` = `customers`.`customer_id`
LEFT JOIN `addresses` ON `orders`.`order_id` = `addresses`.`order_id`
WHERE
    `orders`.`customer_id` IS NOT NULL
AND `orders`.`customer_id` != '0'
AND `orders`.`user_id` IN (3, 5, 10, 15)
GROUP BY
    `orders`.`order_id`
ORDER BY
    `orders`.`order_id` DESC

1 Ответ

0 голосов
/ 01 мая 2018

Вам, вероятно, придется заменить СОЕДИНЕНИЯ на подзапросы:

WHERE EXISTS (
  SELECT *
  FROM customers
  WHERE orders.customer_id=customers.customer_id
    AND ...
)

Тогда вы можете удалить GROUP BY.

Если вы используете отношения:

$query->whereHas('customers', function($query) {
    $query->where(...)
})
...