是否有一种方法可以组合两个MySQL查询以为每个列显示一个唯一值和一个AVG值? 例如在此查询中:
SELECT `price`, `cost`, `shipping`
FROM `orders`
WHERE `year` = 2019 AND `product_id` = 5 AND `order_id` = 77
LIMIT 1
有
SELECT AVG(`price`), AVG(`cost`), AVG(`shipping`)
FROM `orders`
WHERE `year` = 2019 AND `product_id` = 5
我一直在使用联合和联接,但没有找到在同一查询中返回此数据的方法。 (我可以进行两个单独的查询,并将结果数据并排放置,但如果可能的话,我希望使用一个查询来做。)
有什么想法吗?
答案 0 :(得分:2)
由于两个查询都只返回一条记录,因此您可以将它们转换为子查询,然后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