Cómo seleccionar cada n-ésima fila de mysql


Tengo una serie de valores en una base de datos que necesito extraer para crear un gráfico de líneas. Debido a que no requiero alta resolución, me gustaría volver a muestrear los datos seleccionando cada 5ª fila de la base de datos.

 64
Author: Corban Brook, 2009-05-13

6 answers

SELECT * 
FROM ( 
    SELECT 
        @row := @row +1 AS rownum, [column name] 
    FROM ( 
        SELECT @row :=0) r, [table name] 
    ) ranked 
WHERE rownum % [n] = 1 
 66
Author: Taylor Leese,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-06 07:59:02

Puedes intentar mod 5 para obtener filas donde el ID sea múltiplo de 5. (Suponiendo que tienes algún tipo de columna ID que es secuencial.)

select * from table where table.id mod 5 = 0;
 47
Author: Owen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-13 15:54:11

Ya que dijiste que estás usando MySQL, puedes usar variables de usuario para crear una numeración de filas continua. Sin embargo, tienes que poner eso en una tabla derivada (subconsulta).

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

Agregué ORDER BY RAND() para obtener un muestreo pseudoaleatorio, en lugar de permitir que cada quinta fila de la tabla desordenada esté en la muestra cada vez.


Un usuario anónimo intentó editar esto para cambiar x MOD 5 = 0 a x MOD 5 = 1. Lo he cambiado a mi original.

Para el registro, uno puede usar cualquier valor entre 0 y 4 en esa condición, y no hay razón para preferir un valor sobre otro.

 20
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-24 18:19:27
SET @a = 0;
SELECT * FROM t where (@a := @a + 1) % 2 = 0;
 7
Author: Andrey Kon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-29 08:11:59

Yo había estado buscando algo como esto. La respuesta de Taylor y Bill me llevó a mejorar sus ideas.

Tabla data1 tiene campos read_date, valor queremos seleccionar cada registro 2d de una consulta limitada por un rango read_date el nombre de la tabla derivada es arbitrario y aquí se llama DT

Consulta:

 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
 2
Author: Mark Richards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-02 12:32:57
$Query = "SELECT *
          FROM ( 
                SELECT @row := @row +1 AS rownum, posts.*
                FROM (
                       SELECT @row :=0) r, posts
                     ) ranked
                WHERE rownum %3 =1";

Donde los mensajes es mi tabla:

 0
Author: Gor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-21 06:25:53