Permintaan pertama Anda sebaiknya Anda menulisnya seperti ini:
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
Tidak hanya lebih bersih untuk melakukan pemesanan secara eksplisit saat dibutuhkan, bukan di subquery, melakukannya di subquery juga dapat menyebabkan rencana eksekusi yang buruk (yang berarti kinerja buruk jika tabel sementara).
Untuk hasil akhir Anda, sebaiknya Anda tidak langsung menerapkan GROUP BY dan seterusnya. SELECT (dan karena itu variabel dan perhitungan Anda) dievaluasi setelah KELOMPOK OLEH. Untuk melakukan pengelompokan setelah perhitungan Anda, masukkan kueri Anda ke dalam subkueri:
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