2016-12-03 107 views
1

我的产品表提供这样替代子选择在MySQL

Producer Category Quality 
113085  EIT  05 
113085  EIT  06 
113085  EIT  04 
113085  EIT  05 
113085  EIT  05 
116159  EIT  05 
116159  EIT  04 
116159  EIT  04 
110058  EIT  06 
121570  EIT  04 

我想瑟每个生产者相比,平均百分比所有生产者质量等级之间的分配。 像这样:

Producer Category Quality  Totalpercent Producerpercent 
113085  EIT   05   40   60 
113085  EIT   06   20   20 
113085  EIT   04   40   20 

我有这样的选择做我想做的,但它周围260.000记录运行70-80秒,我的服务器上,这是很多:-)

你有任何提示加快这一点?

select 
Producer as Producer1, 
Category as Category1, 
Quality as 'Quality1', 

Round(((select count(*) from base where Category=Category1 and Quality=Quality1 and deliverydate >'2016-10-01')/ 
    (select count(*) from base where Category=Category1 and deliverydate >'2016-10-01') 
    *100),1) as 'Totalpercent', 

Round(((select count(*) from base where Category=Category1 and Quality=Quality1 and deliverydate >'2016-10-01' and Producer=Producer1)/ 
    ((select count(*) from base where Category=Category1 and deliverydate >'2016-10-01' and Producer=Producer1)) 
    *100),1) as 'Producerpercent' 

from base where deliverydate >'2016-10-01' and Producer=113085 group by Category1, Quality1 

回答

0

我认为你可以明确地简化你的查询。这是第一个开始:

SELECT 
    `Producer`, 
    `Category`, 
    `Quality`, 
    round(100*(SELECT COUNT(*) FROM base`subquery` WHERE subquery.Quality = mainquery.Quality)/
     (SELECT COUNT(*) FROM base),1) 
     AS 'Totalpercent', 
    round((100*COUNT(*))/ 
     (SELECT COUNT(*) FROM base WHERE `Producer`=113085),1) 
     AS 'Producerpercent' 
FROM base `mainquery` 
WHERE `Producer`=113085 
GROUP BY `Category`, `Quality` 

这减少了从属子查询的数量。

这里比较:http://www.sqlfiddle.com/#!9/689ce/5