Din första fråga bör du skriva så här:
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
Det är inte bara mer rent att göra beställningen explicit när det behövs, inte i en underfråga, att göra det i en underfråga kan också leda till en dålig exekveringsplan (vilket innebär dålig prestanda i händelse av en tillfällig tabell).
För ditt slutliga resultat bör du inte direkt använda GROUP BY och så vidare. SELECT (och därmed dina variabler och beräkningar) utvärderas efter GROUP BY. För att göra grupperingen efter dina beräkningar, placera din fråga i en underfråga:
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