2011-03-22 52 views
1

我需要獲取特定的跟蹤數據,包括幾個最大和最小值。我已經有一個可怕的方法來做到這一點,但正如你知道這是非常慢,因爲我使用子查詢和表中有成千上萬的行。具體而言,我需要獲取每行不同的MAX值,具體取決於當前行的type_dev。有24000條記錄會變得不可用,而當我嘗試使用MAX子句時,我認爲它更慢。慢得到與每行參數相關的最大值和最小值

SELECT dt.some_data, dt.date_visit, dt.url, 
     (SELECT date_visit FROM device_tracker 
     WHERE type_dev = dt.type_dev ORDER BY date_visit DESC LIMIT 1) last_visit, 
     (SELECT date_visit FROM device_tracker 
     WHERE type_dev = dt.type_dev and url = dt.url ORDER BY date_visit DESC LIMIT 1) last_visit_to_this_url 
    FROM device_tracker dt WHERE some_where_clauses; 

請注意,我不需要全局最大值(也可能是很容易的),但例如,在這種情況下,我得到的每一個type_dev的最大日(每行可以是不同的輸入或不輸入)以及關於每一行的特定網址的最大日期。

我需要與minimun日期相同。

確實有很多更好的方法來做到這一點。任何人都可以點亮它嗎?

回答

1
SELECT * 
FROM (
     SELECT type_dev, MAX(date_visit) AS maxt, MIN(date_visit) AS mint 
     FROM device_tracker 
     GROUP BY 
       type_dev 
     ) t 
JOIN (
     SELECT type_dev, url, MAX(date_visit) AS maxtu, MIN(date_visit) AS mintu 
     FROM device_tracker 
     GROUP BY 
       type_dev, url 
     ) tu 
ON  tu.type_dev = t.type_dev 
JOIN device_tracker dt 
ON  dt.type_dev = tu.type_dev 
     AND dt.url = tu.url 

(type_dev, url, date_visit)上創建一個複合索引,以便快速工作。

+0

這太神奇了。像魅力一樣工作。即使沒有綜合指數,速度也要快得多。謝謝! – 2011-03-22 16:16:22

+0

@Javier:嘗試添加複合索引,查看差異。 – Quassnoi 2011-03-22 16:16:56

+0

我已經做到了,我的意思是說在設置索引之前,我看到了巨大的差異。設置後它甚至更好一點。謝謝! – 2011-03-23 10:58:48

相關問題