如何简化这个多选查询以加快执行速度?

时间:2017-09-15 05:26:52

标签: mysql sql database

这里的SQLFiddle:http://sqlfiddle.com/#!9/b88d1a/1/0 ---注意由于8000个字符的限制,我无法在SQLFiddle中加载足够的插入,并且没有最少量的数据,查询无法运行。因此SQL插入文件位于此pastebin文件中:https://pastebin.com/MfhJ0Svc - 我无法将这些320插入行粘贴到Fiddle或SO抱歉。

我有一个表,然后是一个名为“已审核”的视图,其中包含一个只包含唯一用户名的列。该表名为RebasedQuestions,目前包含大约40000条记录。

该表用于计算人们对人们进行的一系列评论。

查询需要生成一个最终表,该表以百分比形式给出supervisor,own,peer和subordinate的值,然后作为6之外的值(审阅问题选项范围从1到6)。每种评论类型的权重是:

import tflearn

enter image description here

以下是视图的DDL:

Supervisor: 30%
Own: 0%
Peer: 40%
Subordinate: 30%

主表的DDL:

CREATE VIEW Reviewed AS
  SELECT DISTINCT `t1`.`Reviewed` AS `Reviewed`
  FROM `edsdb`.`RebasedQuestions` `t1`
  ORDER BY `t1`.`Reviewed`;

这是我的查询,但我认为它远非优化,所以请告诉我如何加快速度,特别是每当提交新评论时主表增长20行:

create table RebasedQuestions
(
    Reviewed varchar(50) null,
    ReviewType varchar(20) null,
    BU int null,
    RebasedValue double null
)
;

我甚至不能将插入物粘贴在体内。

可以在此pastebin链接上找到它们:https://pastebin.com/MfhJ0Svc

1 个答案:

答案 0 :(得分:1)

这是一个建议,你应该能够适应你的需要。

SELECT 
innerQuery.Reviewed,
innerQuery.BU,
(CASE WHEN (innerQuery.supcount=0) then null else 
innerQuery.suptot/innerQuery.supcount end) as sup,
(CASE WHEN (innerQuery.supcount=0) then null else 
(6*innerQuery.suptot)/(100*innerQuery.supcount) end) as sup6
 ...
(CASE WHEN (innerQuery.supcount=0) then 1.8 else sup6*0.3 end)+ ... as totaled
from  
(SELECT 
Reviewed, 
BU,
(SUM(ReviewType='Supervisor') then RebasedValue else 0 end) as 
suptot
(COUNT(ReviewType='Supervisor') then RebasedValue else 0 end) as 
supcount,
...
FROM RebasedQuestions GROUP BY Reviewed, BU) innerQuery