Как вы выбираете каждую n-ю строку из mysql?

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

6 ответов

Решение
SELECT * 
FROM ( 
    SELECT 
        @row := @row +1 AS rownum, [column name] 
    FROM ( 
        SELECT @row :=0) r, [table name] 
    ) ranked 
WHERE rownum % [n] = 1 

Вы можете попробовать мод 5, чтобы получить строки, где ID кратен 5. (Предполагая, что у вас есть некоторый столбец идентификаторов, который является последовательным.)

select * from table where table.id mod 5 = 0;

Поскольку вы сказали, что используете MySQL, вы можете использовать пользовательские переменные для создания непрерывной нумерации строк. Вы должны поместить это в производную таблицу (подзапрос).

SET @x := 0;
SELECT *
FROM (SELECT (@x:=@x+1) AS x, mt.* FROM mytable mt ORDER BY RAND()) t
WHERE x MOD 5 = 0;

я добавил ORDER BY RAND() чтобы получить псевдослучайную выборку, вместо того, чтобы каждая пятая строка неупорядоченной таблицы каждый раз находилась в выборке.


Анонимный пользователь попытался изменить это, чтобы изменить x MOD 5 = 0 в x MOD 5 = 1, Я изменил его обратно на мой оригинальный.

Для записи можно использовать любое значение от 0 до 4 в этом состоянии, и нет никаких причин предпочитать одно значение другому.

SET @a = 0;
SELECT * FROM t where (@a := @a + 1) % 2 = 0;

Если вы используете MariaDB 10.2, MySQL 8 или новее, вы можете сделать это более эффективно, и я думаю более ясно, используя общие табличные выражения и оконные функции.

WITH ordering AS (
  SELECT ROW_NUMBER() OVER (ORDER BY name) AS n, example.* 
    FROM example ORDER BY name
)
SELECT * FROM ordering WHERE MOD(n, 5) = 0;

По сути, это создает временную таблицу с содержимым example стол, заказанный name поле, добавляет дополнительное поле с именем nкоторый является номером строки, а затем выбирает только те строки с номерами, которые точно делятся на 5, то есть каждую 5-ю строку. На практике движок базы данных часто может оптимизировать это лучше, чем это. Но даже если он не оптимизирует его дальше, я думаю, это понятнее, чем итеративное использование пользовательских переменных, как это было в более ранних версиях MySQL.

Я искал что-то вроде этого. Ответ Тейлора и Билла привел меня к совершенствованию их идей.

таблица data1 имеет поля read_date, значение, которое мы хотим выбрать для каждой двухмерной записи в запросе, ограниченном диапазоном read_date, имя производной таблицы является произвольным и здесь называется DT

запрос:

 SET @row := 0;
  SELECT * FROM  ( SELECT @row := @row +1 AS rownum, read_date, value  FROM data1  
  WHERE  read_date>= 1279771200 AND read_date <= 1281844740 ) as DT WHERE MOD(rownum,2)=0

Если вам не требуется номер строки в наборе результатов, вы можете упростить запрос.

SELECT 
    [column name] 
FROM
    (SELECT @row:=0) temp, 
    [table name] 
WHERE (@row:=@row + 1) % [n] = 1 

Замените следующие заполнители:

  1. Заменить [column name] со списком столбцов, которые вам нужно получить.
  2. Заменить [table name] с названием вашей таблицы.
  3. Заменить [n]с номером. например, если вам нужна каждая 5-я строка, замените ее на 5
$Query = "SELECT *
          FROM ( 
                SELECT @row := @row +1 AS rownum, posts.*
                FROM (
                       SELECT @row :=0) r, posts
                     ) ranked
                WHERE rownum %3 =1";

где сообщения моя таблица:

Вы можете использовать этот запрос,

set @n=2; <!-- nth row -->
select * from (SELECT t.*, 
       @rowid := @rowid + 1 AS ID
  FROM TABLE t, 
       (SELECT @rowid := 0) dummy) A where A.ID mod @n = 0;

или вы можете заменить n своим n-м значением

Другие вопросы по тегам