Comment puis-je obtenir toutes les n lignes de MySQL?
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.
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;