Как выбрать n строк из таблицы, в которой 300 000 строк

#mysql #sql

#mysql #sql

Вопрос:

Я пытаюсь взять каждые 4 строки из своей таблицы, но у меня какая-то ошибка с моим запросом.

Вот моя таблица :

 id | IfInOctets |  IfOutOctets | inDiff | outDiff |    time    | timeDiff
---------------------------------------------------------------------------
1  | 283994207  |  117876089   |  1716  |  52872  | 1555658221 |    59
2  | 283995596  |  117928892   |  1389  |  52803  | 1555658282 |    61
3  | 283995978  |  117929215   |  382   |  323    | 1555658341 |    59
4  | 283996278  |  117929407   |  300   |  192    | 1555658402 |    61
5  | 283996595  |  117929703   |  317   |  296    | 1555658461 |    59
6  | 283998848  |  117932946   |  2253  |  3243   | 1555658522 |    61
7  | 284001482  |  117935214   |  2634  |  2268   | 1555658581 |    59
8  | 284001824  |  117935472   |  342   |  258    | 1555658642 |    61
9  | 284004728  |  117939762   |  2904  |  4290   | 1555658701 |    59
 

Мой запрос :

 SELECT t.id, t.time
FROM
(
    SELECT id, `time`, ROW_NUMBER() OVER (ORDER BY `time`) AS rownum
    FROM monitor
) AS t
WHERE t.rownum % 25 = 0
ORDER BY t.time
 

Ошибка :

1064 У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса для использования рядом с ‘(ПОРЯДОК ПО `времени`) КАК rownum ИЗ mytable ) КАК t, ГДЕ t.rownu’ в строке 4

Вы можете попробовать здесь :

http://www.sqlfiddle.com /#!9/8074b4/3

Комментарии:

1. какая у вас версия БД — она работает здесь — dbfiddle.uk /…

2. Похоже, вы не используете MySQL 8 …

3. Вот версия mysql Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1

4. Версия 5.5 не поддерживает оконные функции.

5. @executable MySQL представил функцию ROW_NUMBER() начиная с версии 8.0.

Ответ №1:

Вы можете эмулировать ROW_NUMBER() функцию, используя переменные в MySQL до версии 8.0:

 SELECT t.id, t.time
FROM (SELECT id, time, @rownum := @rownum   1 AS rownum
      FROM monitor
      CROSS JOIN (SELECT @rownum := 0) r
      ORDER BY time) t
WHERE t.rownum % 4 = 0
ORDER BY t.time
 

Вывод (для ваших выборочных данных):

 id  time
4   1555658402
8   1555658642
 

Демонстрация на dbfiddle

Ответ №2:

 select * from table where id in (select id from table where id%4=0)