2009-05-13 6 views

答えて

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

これはどのように動作するのですか?たとえば、質問は5行ごとに尋ねられ、答えに5の言及はありません。 – Crazometer

+2

@Crazometerクエリの '[n]'を5で置き換えて、5行目ごとに取得します。 –

+0

これを拡張するには、最初の行ではなく2番目の行から開始したい場合はどうすればよいでしょうか? – HPWD

43

あなたは(あなたがシーケンシャルのID列のいくつかの並べ替えを持っていると仮定。)IDが5の倍数である行を取得するためにmod 5を試みることができる

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

また、削除またはロールバックのためにシーケンスにギャップがないと仮定します。 –

+2

これは大部分は機能しますが、削除された行は考慮しません。 –

+1

いくつかのテストでシンプルで素晴らしい: –

20

あなたはMySQLの、あなたを使用していると述べたので、 user variablesを使用して連続した行番号を付けることができます。あなたはそれを派生テーブル(サブクエリ)に入れなければなりません。

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; 

I代わりに順序付けられていないテーブルのすべての5行目は、サンプル中のすべての時間であることが可能で、擬似ランダムサンプリングを得るためORDER BY RAND()を添加しました。


匿名ユーザーがx MOD 5 = 1x MOD 5 = 0を変更するには、このを編集しようとしました。私はそれをオリジナルに戻しました。

レコードでは、その条件で0と4の間の任意の値を使用できます。別の値よりも1つの値を優先する理由はありません。

+0

私はこれに私の答えを更新していた、あなたはそれに私を打つ!いい考え。 –

+0

残念ながら、これにより、多くのエントリを扱うときに実行が少なくともx100遅くなります – Blauhirn

2

私はこのようなものを探していました。テイラーとビルの答えは、自分のアイデアを改善するように私を導いた。

テーブルDATA1は、フィールドが値 は、我々は派生テーブルの名前は任意であり、ここでDT

がクエリと呼ばれるread_date範囲 によって制限されたクエリからすべての2Dのレコードを選択したい、read_dateました:

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

ありがとう、私はこれを探していた。ストアドプロシージャのログテーブルの特定の列が2回ごとに同じ値を持っているかどうかを何とか確認する必要がありました。 'proc starting'、 'proc ending'のようになります。すべてが正常であれば、下のsqlは1になります。 'SET @row:= 0; SELECTカウント(別個のメッセージ)FROM( SELECT @row:= @row +1 AS rownum、メッセージ FROM操作。イベントログ ここで、LogTime> now() - 間隔6時間 およびプロシージャ名= 'Do_CDR' として、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"; 

ポストは私のテーブルです:

関連する問題