-1

谁能帮我优化这个查询?

SELECT distinct t.designation,
      (SELECT sum(time_to_sec(timediff(outtime,intime))) 
       FROM onlinetime where datecreated BETWEEN '2012-01-01 00:00:01' 
       AND '2012-12-31 23:59:59' and designation=t.designation) as totsec
FROM onlinetime t;

我正在尝试从在线时间表中获取名称和秒数。它只有 8000 条记录,但上述查询需要大量时间来执行。有没有其他方法可以优化这个?

4

2 回答 2

3

当您可以直接获得每个名称的总摘要时,您为什么需要加入表格

SELECT  designation, sum(time_to_sec(timediff(outtime,intime))) totsec
FROM    onlinetime
WHERE   datecreated BETWEEN '2012-01-01 00:00:01' AND '2012-12-31 23:59:59'
GROUP   BY designation

只需在列上添加索引以datecreated获得更快的性能。

ALTER TABLE onlinetime ADD INDEX (datecreated)

或者也许你想要这个,

SELECT  a.designation, 
        COALESCE(sum(time_to_sec(timediff(b.outtime,b.intime))), 0) totsec
FROM    onlinetime a
        LEFT JOIN onlinetime b
            ON  a.designation = b.designation AND
                b.datecreated BETWEEN '2012-01-01 00:00:01' AND '2012-12-31 23:59:59'
GROUP   BY a.designation
于 2013-02-25T15:55:10.477 回答
0

正确答案是:

SELECT t.designation,
       sum(case when datecreated between '2012-01-01 00:00:01' AND '2012-12-31 23:59:59'
                then sum(time_to_sec(timediff(outtime,intime)
           end) as totsec
from onlinetime t
group by t.designation

将过滤放在where子句中错过了原始查询的意图,即保留表中的所有“指定”。

于 2013-02-25T16:49:45.430 回答