我可以将这两个 SQL 查询合并为一个吗?
Can I combine these two SQL queries into one?
drink_orders
有很多 drink_order_extras
第一个:
SELECT
Sum(drink_orders.quantity * drink_orders.drink_price) AS drink_total
FROM
drink_orders
WHERE
drink_orders.reservation_id = 3610
第二个
SELECT
Sum(drink_order_extras.quantity * drink_order_extras.drink_price) AS extra_total
FROM
drink_order_extras INNER JOIN
drink_orders ON drink_order_extras.drink_order_id = drink_orders.id
WHERE
drink_orders.reservation_id = 3610
最好能得到一个总计 (drink_total + extra_total)
仅供参考,以下 不是 导致正确的总和:
SELECT
Sum(drink_orders.quantity * drink_orders.drink_price) AS drink_total,
Sum(drink_order_extras.quantity * drink_order_extras.drink_price) AS extra_total
FROM
drink_order_extras INNER JOIN
drink_orders ON drink_order_extras.drink_order_id = drink_orders.id
WHERE
drink_orders.reservation_id = 3610
编辑:
Gordon Linoff 的回答很有效:
SELECT Sum(do.quantity * do.drink_price) AS drink_total,
Sum(extras_total) as extras_total,
(Sum(do.quantity * do.drink_price) + COALESCE(Sum(extras_total), 0)
) as total
FROM drink_orders do LEFT JOIN
(SELECT doe.drink_order_id,
Sum(doe.quantity * doe.drink_price) as extras_total
FROM drink_order_extras doe
GROUP BY drink_order_id
) doe
ON do.id = doe.drink_order_id
WHERE do.reservation_id = 3610;
试试这个:
select sum(total) from (
SELECT
Sum(drink_orders.quantity * drink_orders.drink_price) AS total
FROM
drink_orders
WHERE
drink_orders.reservation_id = 3610
UNION
SELECT
Sum(drink_order_extras.quantity * drink_order_extras.drink_price) AS total
FROM
drink_order_extras INNER JOIN
drink_orders ON drink_order_extras.drink_order_id = drink_orders.id
WHERE
drink_orders.reservation_id = 3610
) t
您正在沿两个不同的维度求和。 join
导致了笛卡尔积——这会导致求和。您可以通过在加入之前聚合来解决此问题:
SELECT Sum(do.quantity * do.drink_price) AS drink_total,
Sum(extras_total) as extras_total,
(Sum(do.quantity * do.drink_price) + COALESCE(Sum(extras_total), 0)
) as total
FROM drink_orders do LEFT JOIN
(SELECT doe.drink_order_id,
Sum(doe.quantity * doe.drink_price) as extras_total
FROM drink_orders_extras doe
GROUP BY drink_order_id
) doe
ON do.id = doe.drink_order_id
WHERE do.reservation_id = 3610;
这首先将附加项加到酒单上。然后将所有酒单信息汇总为预订级别。
drink_orders
有很多 drink_order_extras
第一个:
SELECT
Sum(drink_orders.quantity * drink_orders.drink_price) AS drink_total
FROM
drink_orders
WHERE
drink_orders.reservation_id = 3610
第二个
SELECT
Sum(drink_order_extras.quantity * drink_order_extras.drink_price) AS extra_total
FROM
drink_order_extras INNER JOIN
drink_orders ON drink_order_extras.drink_order_id = drink_orders.id
WHERE
drink_orders.reservation_id = 3610
最好能得到一个总计 (drink_total + extra_total)
仅供参考,以下 不是 导致正确的总和:
SELECT
Sum(drink_orders.quantity * drink_orders.drink_price) AS drink_total,
Sum(drink_order_extras.quantity * drink_order_extras.drink_price) AS extra_total
FROM
drink_order_extras INNER JOIN
drink_orders ON drink_order_extras.drink_order_id = drink_orders.id
WHERE
drink_orders.reservation_id = 3610
编辑:
Gordon Linoff 的回答很有效:
SELECT Sum(do.quantity * do.drink_price) AS drink_total,
Sum(extras_total) as extras_total,
(Sum(do.quantity * do.drink_price) + COALESCE(Sum(extras_total), 0)
) as total
FROM drink_orders do LEFT JOIN
(SELECT doe.drink_order_id,
Sum(doe.quantity * doe.drink_price) as extras_total
FROM drink_order_extras doe
GROUP BY drink_order_id
) doe
ON do.id = doe.drink_order_id
WHERE do.reservation_id = 3610;
试试这个:
select sum(total) from (
SELECT
Sum(drink_orders.quantity * drink_orders.drink_price) AS total
FROM
drink_orders
WHERE
drink_orders.reservation_id = 3610
UNION
SELECT
Sum(drink_order_extras.quantity * drink_order_extras.drink_price) AS total
FROM
drink_order_extras INNER JOIN
drink_orders ON drink_order_extras.drink_order_id = drink_orders.id
WHERE
drink_orders.reservation_id = 3610
) t
您正在沿两个不同的维度求和。 join
导致了笛卡尔积——这会导致求和。您可以通过在加入之前聚合来解决此问题:
SELECT Sum(do.quantity * do.drink_price) AS drink_total,
Sum(extras_total) as extras_total,
(Sum(do.quantity * do.drink_price) + COALESCE(Sum(extras_total), 0)
) as total
FROM drink_orders do LEFT JOIN
(SELECT doe.drink_order_id,
Sum(doe.quantity * doe.drink_price) as extras_total
FROM drink_orders_extras doe
GROUP BY drink_order_id
) doe
ON do.id = doe.drink_order_id
WHERE do.reservation_id = 3610;
这首先将附加项加到酒单上。然后将所有酒单信息汇总为预订级别。