有没有一种方法来组合使用两个MySQL查询显示一个独特的价值,并针对每一列AVG价值?如在此查询:
SELECT `price`, `cost`, `shipping`
FROM `orders`
WHERE `year` = 2019 AND `product_id` = 5 AND `order_id` = 77
LIMIT 1
WITH
SELECT AVG(`price`), AVG(`cost`), AVG(`shipping`)
FROM `orders`
WHERE `year` = 2019 AND `product_id` = 5
我一直在玩与工会和加入,但我没有找到一种方法来在同一查询返回此数据。 (我可以让两个单独的查询,并把得到的数据并排的一面,但我更喜欢用一个查询,如果能够做到这一点。)
有任何想法吗?
由于这两个查询返回只有一个记录,你可能只是他们转向子查询和CROSS JOIN
它们:
SELECT a.price, a.cost, a.shipping, avg.price, avg.cost, avg.shipping
FROM
(
SELECT `price`, `cost`, `shipping`
FROM `orders`
WHERE `year` = 2019 AND `product_id` = 5 AND `order_id` = 77
LIMIT 1
) a
CROSS JOIN (
SELECT AVG(`price`) price, AVG(`cost`) cost, AVG(`shipping`) shipping
FROM `orders`
WHERE `year` = 2019 AND `product_id` = 5
) avg
在第一子查询的LIMIT 1
条款的目的尚不清楚:既然没有ORDER BY
,它是不可预测的,其记录将如果超过一个匹配返回。
下面是使用聚合条件的替代方法(若有几个记录与订单ID 77
存在,将显示各列的最大值):
SELECT
MAX(CASE WHEN `order_id` = 77 THEN `price` END) price,
MAX(CASE WHEN `order_id` = 77 THEN `cost` END) cost,
MAX(CASE WHEN `order_id` = 77 THEN `shipping` END) shipping,
AVG(`price`) avg_price,
AVG(`cost`) avg_cost,
AVG(`shipping`) avg_shipping
FROM `orders`
WHERE `year` = 2019 AND `product_id` = 5