繁体   English   中英

我如何优化以下mysql查询?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM