आपकी पहली क्वेरी आप इसे इस तरह बेहतर तरीके से लिख सकते हैं:
SELECT guid, current_level , if(@id <> guid, @lev := 10, 0) AS useless, case when @id <> guid then @id := guid else 0 end AS useless2
, (case when (current_level = 200 AND current_level <> @lev) then 1 else 0 end) as TIMES
, if(current_level = 200 AND current_level <> @lev, @lev := current_level, 0) AS useless3
FROM sensor_logs
, (SELECT @id := 'none', @lev := 10) var_init_subquery
ORDER BY guid
न केवल आवश्यकता होने पर स्पष्ट रूप से ऑर्डर करना अधिक साफ है, सबक्वेरी में नहीं, इसे सबक्वायरी में करने से खराब निष्पादन योजना भी हो सकती है (जिसका अर्थ है अस्थायी तालिका के मामले में खराब प्रदर्शन)।
अपने अंतिम परिणाम के लिए, आपको सीधे GROUP BY वगैरह लागू नहीं करना चाहिए। चयन (और इसलिए आपके चर और गणना) का मूल्यांकन बाद . किया जाता है ग्रुप बाय। अपनी गणना के बाद समूहीकरण करने के लिए, अपनी क्वेरी को एक सबक्वेरी में रखें:
SELECT guid, SUM(times) FROM (
SELECT guid, current_level , if(@id <> guid, @lev := 10, 0) AS useless, case when @id <> guid then @id := guid else 0 end AS useless2
, (case when (current_level = 200 AND current_level <> @lev) then 1 else 0 end) as TIMES
, if(current_level = 200 AND current_level <> @lev, @lev := current_level, 0) AS useless3
FROM sensor_logs
, (SELECT @id := 'none', @lev := 10) var_init_subquery
ORDER BY guid
) sq
GROUP BY guid