Din første forespørgsel, du må hellere skrive den sådan her:
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
Ikke alene er det mere rent at udføre ordren eksplicit, når det er nødvendigt, ikke i en underforespørgsel, at gøre det i en underforespørgsel kan også føre til en dårlig eksekveringsplan (hvilket betyder dårlig ydeevne i tilfælde af en midlertidig tabel).
For dit endelige resultat bør du ikke anvende GROUP BY direkte og så videre. SELECT (og derfor dine variabler og beregninger) evalueres efter GRUPPE AF. For at udføre grupperingen efter dine beregninger, læg din forespørgsel i en underforespørgsel:
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