sql >> Databáze >  >> RDS >> Mysql

Počítání nesouvislých hodnot

Svůj první dotaz raději napište takto:

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

Nejen, že je přehlednější provádět řazení explicitně, když je to potřeba, nikoli v poddotazu, ale provádění v poddotazu může také vést ke špatnému plánu provádění (což znamená špatný výkon v případě dočasné tabulky).

Pro konečný výsledek byste neměli přímo aplikovat GROUP BY a tak dále. SELECT (a tedy i vaše proměnné a výpočty) jsou vyhodnoceny po GROUP BY. Chcete-li provést seskupení po vašich výpočtech, vložte dotaz do poddotazu:

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



  1. Databáze SQL Server Importers z celého světa kompatibilní s přístupem

  2. SQLite AVG

  3. Příklad demonstrující zranitelnost SQL Injection a její prevence v Oracle

  4. Nelze se připojit k mysql na digitalocean pomocí workbench přes ssh