[英]How can i optimize the following mysql query?
我想得到每个品牌的金额的总和
我如何优化查询?
SELECT a1,a2,a3,a4,a5
FROM (
(SELECT SUM(amount) as a1 FROM `category_data` WHERE brand ='brand1' ) AS t1,
(SELECT SUM(amount) as a2 FROM `category_data` WHERE brand ='brand2' ) AS t2,
(SELECT SUM(amount) as a3 FROM `category_data` WHERE brand ='brand3' ) AS t3,
(SELECT SUM(amount) as a4 FROM `category_data` WHERE brand ='brand4' ) AS t4,
(SELECT SUM(amount) as a5 FROM `category_data` WHERE brand ='brand5' ) AS t5
)
表
name brand amount
--------------------------
name1 brand1 1000
name2 brand2 2000
name3 brand1 1200 ...........
您可以在单个查询中使用CASE
语句,而不是运行5个查询
SELECT
SUM(CASE WHEN brand ='brand1' THEN amount ELSE 0 END ) a1,
SUM(CASE WHEN brand ='brand2' THEN amount ELSE 0 END ) a2,
SUM(CASE WHEN brand ='brand3' THEN amount ELSE 0 END ) a3,
SUM(CASE WHEN brand ='brand4' THEN amount ELSE 0 END ) a4,
SUM(CASE WHEN brand ='brand5' THEN amount ELSE 0 END ) a5
FROM `category_data`
同样,在不将聚合函数分组的情况下使用聚合函数会将整个表数据视为一组,因此您应该查看GROUP BY (Aggregate) Functions
下意识的回答是要确保您拥有一个覆盖指数,其中brand
,并且包括amount
列,例如:
... ON category_data (brand, amount)
该查询也可以被重写
SELECT SUM(IF(t.brand='brand1',t.amount,NULL)) AS a1
, SUM(IF(t.brand='brand2',t.amount,NULL)) AS a2
, SUM(IF(t.brand='brand3',t.amount,NULL)) AS a3
, SUM(IF(t.brand='brand4',t.amount,NULL)) AS a4
, SUM(IF(t.brand='brand5',t.amount,NULL)) AS a5
FROM `category_data` t
WHERE t.brand IN ('brand1','brand2','brand3','brand4','brand5')
这可能会更好,特别是如果MySQL不使用原始查询的索引,而是对category_data
表执行了五次完整扫描。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.