2013-02-25 190 views
-1

任何人都可以幫助我優化此查詢嗎?無子查詢的MySql查詢優化

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; 

我想從onlinetime表中獲取指定和秒數的總和。它只有8000條記錄,但上面的查詢花費很多時間來執行。有沒有其他的方法來優化這個?

回答

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 
+0

這就是我想要的...謝謝你的時間... – user1854007 2013-02-25 16:04:17

+0

不客氣':D' – 2013-02-25 16:06:17

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子句中忽略了原始查詢的意圖,這是將所有「指定」放在表格中。