2009-05-13 8 views

Répondre

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

Quelqu'un peut-il fournir plus d'informations sur comment cela fonctionne? Par exemple la question posée pour chaque 5ème rangée et il n'y a aucune mention de 5 dans la réponse. – Crazometer

+2

@Crazometer remplacer '[n]' dans la requête avec 5 pour obtenir chaque 5ème rangée. –

+0

Pour développer cela, que se passe-t-il si vous ne voulez pas commencer avec la première ligne mais la 2ème par exemple? – HPWD

43

Vous pouvez essayer mod 5 pour obtenir les lignes où l'ID est multiple de 5. (En supposant que vous avez une sorte de colonne ID qui est séquentielle.)

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

En supposant également que vous n'avez aucun espace dans la séquence, en raison de la suppression ou de l'annulation. –

+2

Cela fonctionnerait pour la plupart, mais ne tient pas compte des lignes supprimées. –

+1

Simple et brillant pour certains tests :-) –

20

Puisque vous avez dit que vous utilisez MySQL, vous pouvez utiliser user variables pour créer une numérotation continue des lignes. Vous devez cependant mettre cela dans une table dérivée (sous-requête).

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

J'ajouté ORDER BY RAND() pour obtenir un échantillonnage pseudo-aléatoire, au lieu de permettre à chaque cinquième ligne de la table pour être non ordonnée dans l'échantillon à chaque fois.


Un utilisateur anonyme a essayé de la modifier pour changer x MOD 5 = 0-x MOD 5 = 1. Je l'ai changé à mon original. Pour l'enregistrement, on peut utiliser n'importe quelle valeur entre 0 et 4 dans cette condition, et il n'y a aucune raison de préférer une valeur plutôt qu'une autre.

+0

Je mettais à jour ma réponse à cela, et tu m'as battu dessus! Bien pensé. –

+0

malheureusement, cela ralentit l'exécution d'au moins x100 lorsque vous travaillez avec de nombreuses entrées – Blauhirn

2

Je cherchais quelque chose comme ça. La réponse de Taylor et Bill m'a amené à améliorer leurs idées.

Table data1 a des champs read_date, la valeur nous voulons sélectionner tous les enregistrements 2d d'une requête limitée par une gamme read_date le nom de la table dérivée est arbitraire et ici est appelé DT

requête:

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

Merci, je cherchais ça. J'avais besoin de vérifier en quelque sorte si une certaine colonne dans une table de notation pour des procédures stockées avait la même valeur toutes les deux fois. Comme 'proc commençant', 'proc ending'. Le sql ci-dessous se traduira par 1 si tout va bien. 'SET @row: = 0; SELECT count (message distinct) FROM ( SELECT @row: = @row +1 AS rownum, Message FROM opérations.EventLog O Log LogTime> now() - intervalle 6 heures et ProcedureName = 'Do_CDR' ) en tant que DT WHERE MOD (rownum, 2) = 0; ' – eigil

6
SET @a = 0; 
SELECT * FROM t where (@a := @a + 1) % 2 = 0; 
0
$Query = "SELECT * 
      FROM ( 
       SELECT @row := @row +1 AS rownum, posts.* 
       FROM (
         SELECT @row :=0) r, posts 
        ) ranked 
       WHERE rownum %3 =1"; 

où les messages est ma table:

Questions connexes