2016-11-14 32 views
1

我有表'master_log',用於存儲所有操作的所有數據。每個記錄通過'm_id'連接在一起:什麼我可以使用子查詢,而不是搜索MAX()?

m_id | value_type_id | value 
------------------------------------------ 
1 | room   | ONE 
1 | temperature | 23 
1 | humidity  | 55 
1 | timestamp  | 2016-11-01 00:00:01 
2 | room   | TWO 
2 | timestamp  | 2016-11-01 00:10:51 
2 | temperature | 24 
3 | room   | ONE 
3 | temperature | 24 
3 | timestamp  | 2016-11-01 00:18:24 
------------------------------------------ 

我需要房間ONE的最高溫度。我現在使用的查詢是在這裏:

SELECT MAX(value) 
FROM master_log 
WHERE value_type_id = 'temperature' 
    AND m_id IN (SELECT m_id 
        FROM master_log 
        WHERE value = 'ONE') 

當我開始測量,查詢快,但現在隨着數百萬條記錄也不算快,我在尋找最快的方法。請任何想法嗎?

+0

很難提供一個更快的解決方案,而無需到表結構(索引等),更深入的瞭解。請附上'EXPLAIN ' - 查詢的結果,以便我們幫助您。一個*想法*將通過'JOIN'替換子查詢,但我不確定它是否會比查詢更快('SELECT MAX(l2.value) FROM master_log l1 JOIN master_log l2 ON(l1 .m_id = l2.m_id) WHERE l1.value_type_id ='ROOM'AND l1.value ='ONE'AND l2.value_type_id ='temperature'') –

+0

是的,加入是我想要的而不是子查詢。首先我需要選擇所有m_id,其中是房間一和第二我需要從這個m_id只選擇溫度和計數max()。我不明白的是加入只有一個表。 –

+0

感謝Martin Schneider爲JOIN提供的查詢,它叉得很快,我的子查詢查詢需要10s,加入查詢需要0.4s。完美,再一步爲我的知識。 –

回答

0

例如爲:

SELECT m_id 
    , MAX(CASE WHEN value_type_id = 'room' THEN value END) room 
    , MAX(CASE WHEN value_type_id = 'temperature' THEN value END) temperature 
    , MAX(CASE WHEN value_type_id = 'humidity' THEN value END) humidity 
    , MAX(CASE WHEN value_type_id = 'timestamp' THEN value END) timestamp 
    FROM master_log 
GROUP 
    BY m_id 
HAVING room = 'ONE' 
ORDER 
    BY temperature DESC 
LIMIT 1; 

...但是,適當的索引,馬丁的解決方案會更快

相關問題