La requête ci-dessous fonctionne mais est très coûteux en calcul (il y a> 14k enregistrements); cela peut-il être fait plus efficacement (par exemple sans une requête imbriquée)? Fondamentalement, il correspond à des instances dans la même table qui représentent une commande d'activation (log1) avec la commande d'arrêt de premier ordre (log2).Requête SQL: est-ce possible sans une requête imbriquée?
SELECT log1.`deviceID`, log1.`timestamp` AS `on`, log2.`timestamp` as `off`
FROM `HC2_log_raw` log1, `HC2_log_raw` log2
WHERE log1.`newValue` > 0 AND log1.`oldValue` = 0 AND log2.`newValue` = 0 AND log1.`deviceID` = log2.`deviceID` AND
log2.`timestamp` =
(SELECT MIN(log3.`timestamp`)
FROM `HC2_log_raw` log3
WHERE log3.`timestamp` > log1.`timestamp` AND log3.`deviceID` = log1.`deviceID` AND log3.`newValue`=0)
Merci!
documents 14k ne sont pas beaucoup. avez-vous déjà regardé le plan d'exécution? vous pourriez avoir juste besoin d'un index –
avez-vous utilisé des index sur des colonnes conditionnées de jointure? –
Cela n'aidera pas les performances, mais vous devriez passer à la syntaxe explicite 'join', c'est la norme ANSI depuis 1992! – HoneyBadger