Как вы выбираете каждый n-й ряд из MySQL - PullRequest
66 голосов
/ 13 мая 2009

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

Ответы [ 7 ]

70 голосов
/ 13 мая 2009
SELECT * 
FROM ( 
    SELECT 
        @row := @row +1 AS rownum, [column name] 
    FROM ( 
        SELECT @row :=0) r, [table name] 
    ) ranked 
WHERE rownum % [n] = 1 
51 голосов
/ 13 мая 2009

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

select * from table where table.id mod 5 = 0;
22 голосов
/ 13 мая 2009

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

8 голосов
/ 29 апреля 2015
SET @a = 0;
SELECT * FROM t where (@a := @a + 1) % 2 = 0;
2 голосов
/ 15 августа 2010

Я искал что-то подобное. Ответ Тейлора и Билла заставил меня улучшить их идеи.

таблица data1 имеет поля read_date, значение мы хотим выбрать каждую 2d запись из запроса, ограниченного диапазоном 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
0 голосов
/ 14 мая 2019

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

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 на nth значение

0 голосов
/ 21 апреля 2016
$Query = "SELECT *
          FROM ( 
                SELECT @row := @row +1 AS rownum, posts.*
                FROM (
                       SELECT @row :=0) r, posts
                     ) ranked
                WHERE rownum %3 =1";

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...