Как я могу получить все n строк в MySQL?
Вопрос
У меня есть таблица, которая содержит данные, записываемые каждую минуту, поэтому у меня есть строка для каждой минуты.При возврате данных для обработки требуется такая точность за последние 6 часов, но после этого достаточно более низкого уровня точности, напримеркаждые 5 минут.
Я могу вернуть все данные в массив, а затем удалить все, кроме каждого 5-го элемента, но для этого требуется, чтобы все данные возвращались MySQL, а затем сначала считывались в массив - довольно много данных.
Как я могу вернуть каждую n-ю строку в MySQL?Я прочитал это сообщение в блоге, в котором предлагается использовать PrimaryKey % 5 = 0, где PrimaryKey - это auto_increment, но это
a) не использует индексы b) возвращает только значения PrimaryKey, которые делятся на 5 и в случае удаления могут фактически не находиться в каждой пятой строке
Можно ли это сделать только в рамках SQL-запроса или для этого потребуется перебирать строку за строкой по результирующему набору с помощью курсоров?
Я использую MySQLi в PHP для подключения к базе данных.
Решение
Список временных меток каждые 5 минут:
SELECT
MIN(logtimestamp) AS first_of_five_minutes
FROM tLog
GROUP BY
DATE(logtimestamp),
HOUR(logtimestamp),
MINUTE(logtimestamp) - (MINUTE(logtimestamp) % 5)
Теперь вы можете использовать это как дополнительный выбор, чтобы получить запрошенные записи журнала, присоединившись logtimestamps
Для first_of_five_minutes
на .Конечно, дополнительные WHERE
-предложения должны быть реплицированы внутри и снаружи, чтобы вы получили "правильные" временные метки.
Также обратите внимание, что это возвращает первую временную метку за каждый пятиминутный интервал, тогда как решения напрямую используют minutes%5 = 0
возвращайте только логи, которые на самом деле кратны : 05, что может привести к сбою, если у вас возникли задержки при записи журналов или что-то подобное.
Другие советы
полностью непроверенный, но это может сработать
SELECT Row, col_a
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1
WHERE Row%5 = 0;