Question

J'ai un tableau qui contient des données enregistrées toutes les minutes. J'ai donc une ligne pour chaque minute. Lors du renvoi des données pour traitement, cette précision est requise pour les 6 dernières heures, mais après cela, un niveau de précision inférieur est suffisant, par ex. toutes les 5 minutes.

Je peux renvoyer toutes les données dans un tableau, puis supprimer tous les éléments sauf un cinquième, mais cela nécessite que MySQL retourne toutes les données, puis les lise dans le tableau en premier - beaucoup de données.

Comment puis-je retourner chaque nième ligne dans MySQL? J'ai lu ce billet de blog qui suggère d'utiliser primaryKey% 5 = 0 où primaryKey est auto_increment mais

a) n'utilise pas d'index b) renverra uniquement les valeurs primaryKey divisibles par 5 et, dans le cas des suppressions, susceptibles de ne pas être réellement toutes les 5 lignes

Cela peut-il être effectué uniquement dans la requête SQL ou nécessitera-t-il une boucle, ligne par ligne, dans le jeu de résultats à l'aide de curseurs?

J'utilise MySQLi en PHP pour se connecter à la base de données.

Était-ce utile?

La solution

La liste des horodatages toutes les 5 minutes:

SELECT
  MIN(logtimestamp) AS first_of_five_minutes
FROM tLog
GROUP BY
  DATE(logtimestamp),
  HOUR(logtimestamp),
  MINUTE(logtimestamp) - (MINUTE(logtimestamp) % 5)

Maintenant, vous pouvez l’utiliser comme sous-sélection pour obtenir les entrées de journal demandées en joignant logtimestamps à first_of_five_minutes sur le. Bien sûr, les WHERE - clauses supplémentaires doivent être répliquées à l'intérieur et à l'extérieur afin que vous obteniez le & "Right &"; horodatage.

Notez également que cela renvoie le premier horodatage toutes les cinq minutes. Dans ce cas, les solutions utilisant directement minutes%5 = 0 ne renvoient que les entrées qui se trouvent en fait sur des multiples de: 05, ce qui peut échouer si vous avez des retards dans l'enregistrement des journaux ou similaires. .

Autres conseils

complètement non testé mais cela pourrait fonctionner

SELECT Row, col_a 
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1 
WHERE Row%5 = 0; 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top