Je eerste vraag kun je beter zo schrijven:
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
Het is niet alleen schoner om de bestelling expliciet uit te voeren wanneer dat nodig is, niet in een subquery, maar als u het in een subquery doet, kan dit ook leiden tot een slecht uitvoeringsplan (wat slechte prestaties betekent in het geval van een tijdelijke tabel).
Voor uw eindresultaat moet u de GROUP BY enzovoort niet rechtstreeks toepassen. De SELECT (en dus je variabelen en berekeningen) worden geëvalueerd na de GROEP DOOR. Om de groepering na uw berekeningen uit te voeren, plaatst u uw zoekopdracht in een subquery:
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