Как я могу получить каждые n строк в MySQL? - PullRequest
9 голосов
/ 02 февраля 2009

У меня есть таблица, которая содержит данные, записываемые каждую минуту, поэтому у меня есть строка для каждой минуты. При возврате данных для обработки эта точность требуется в течение последних 6 часов, но после этого достаточно более низкий уровень точности, например каждые 5 минут.

Я могу вернуть все данные в массив, а затем удалить все, кроме каждого 5-го элемента, но для этого требуется, чтобы все данные были возвращены MySQL, а затем сначала прочитаны в массив - довольно много данных.

Как я могу вернуть каждую n-ю строку в MySQL? Я прочитал это сообщение в блоге, в котором предлагается использовать primaryKey% 5 = 0, где primaryKey - auto_increment, но это

а) не использует индексы b) будет возвращать только значения primaryKey, которые делятся на 5, а в случае удалений могут быть не на каждой 5-й строке

Может ли это быть сделано только внутри SQL-запроса, или потребуется циклический цикл по результирующему набору результатов с помощью курсоров?

Я использую MySQLi в PHP для подключения к БД.

Ответы [ 2 ]

3 голосов
/ 02 февраля 2009

Список отметок времени каждые 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, что может не сработать, если у вас есть задержки в записи журналов или аналогичные .

0 голосов
/ 02 февраля 2009

полностью не проверено, но это может сработать

SELECT Row, col_a 
FROM (SELECT @row := @row + 1 AS Row, col1 AS col_a FROM table1) As derived1 
WHERE Row%5 = 0; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...