0
votes

Comment aller chercher toutes les lignes à 10 minutes en une seule requête dans PHP MySQL?

J'ai la table le périphérique em> contenant des valeurs de température enregistrées et leur temps de mesure .J'ai besoin d'échantillonner ces données en obtenant uniquement des valeurs d'au moins 10 minutes. ( EX Si la première ligne se lit (30k, 8.40.00), la ligne suivante contient la valeur après ou à 8h50.00 (selon les valeurs de 10 minutes suivantes). Ma colonne de temps est stockée comme format de pique (h.m.s). Ma requête de sélection actuelle en PHP est

$sql="select value ,time from device where time >= '$interval' order by time limit 1";


2 commentaires

Il est peut-être préférable d'utiliser une boucle de 1 SQL, de les lire tous dans l'ordre de temps. Ensuite, dans votre boucle PHP, vous pouvez vérifier le temps contre $ intervalle et l'ignorer s'il ne dépasse pas la valeur.


Tâche délicate, cela m'a eu lieu lorsque je faisais des analytiques d'utilisateurs visités et que je devais les séparer par 10 minutes d'intervalle pour suivre les visites rebondissantes. J'ai besoin de vérifier comment j'ai résolu ce temps pour vous aider ici.


3 Réponses :


-1
votes

Je pense que cela fonctionnerait: xxx

Si vous avez une valeur multiple de 10 minutes et que vous en voulez simplement une, utilisez un groupe par minute ( heure )


2 commentaires

Cela suppose simplement que les événements se produisent à des moments fixes dans l'heure. Même si vous les avez rendu par rapport à une heure précise, et si un événement s'est passé 11 minutes après cette heure.


Essayez: $ sql = "Sélectionnez Valeur , TIME , MINUTE ( TIMESTAMP ) à partir du périphérique Où minute (< CODE> TEMPS ) Dans ('0%', '1%', '2%', '3%', '4%', '5%', commander par temps groupe par minute ( horodatage ) "; Ce n'est pas clair de votre question si vous voulez un intervalle de 10 minutes (que j'ai compris) ou obtenez juste environ 10 minutes et recommencez 10 minutes après la dernière valeur de la dernière valeur.



1
votes

Ceci est plus compliqué que vous ne le pensez. Vous ne pouvez pas simplement regarder par-dessus des intervalles entre des lignes consectives, vous devez suivre la trace de la dernière ligne sélectionnée pour identifier le prochain. Cela implique un processus itératif; Dans SQL, cela est généralement mis en œuvre à l'aide d'une requête récursive - que MySQL prend en charge la version 8.0 de départ 8.0.

Considérez: P>

with recursive cte as (
    select value, time 
    from device 
    where time = (select min(time) from device)
    union all
    select d.value, d.time 
    from cte c
    inner join device d on d.time = (
        select min(d1.time) from device d1 where d1.time >= c.time + interval 10 minute
    )
)
select * from cte


0 commentaires

0
votes

Je suggérerais d'abord à l'aide de fonctions de fenêtre pour obtenir la valeur de chaque ligne 10 minutes plus tard (au moins), puis appliquant la sous-requête récursive:

with recursive d(value, time, next_time) as (
      select value, time,
             min(time) over (order by time
                             range between interval 10 minute following and unbounded following
                            ) as next_time
      from device
     )
     recursive cte(value, time, next_time) as (
      (select value, time, next_time
       from d 
       order by time
       limit 1
      ) union all
      select d.value, d.time, d.next_time
      from cte join
           d 
           on device.time = cte.next_time
      )
select *
from cte;


0 commentaires