MySQLで条件に合うレコードから指定件数分のデータを抽出したいのですが、スマートな方法を教えて下さい。


例えば、以下のようなテーブルがあったとすると、
ーーーーーーーーーー
NAME , AGE
ーーーーーーーーーー
  …
aaaa , 21
bbbb , 25
cccc , 30
dddd , 21
eeee , 49
ffff , 34
  …
ーーーーーーーーーー
NAME='cccc'のレコードから3件を抽出する、といった感じです。

条件に合うレコードの位置が分かっていれば「limit」で抽出できるのですが、上記のような場合、開始レコードの条件と件数を指定して抽出するにはどうすれば良いでしょうか?

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2012/04/03 04:10:59
  • 終了:2012/04/03 14:59:02

ベストアンサー

id:a-kuma3 No.2

a-kuma3回答回数4363ベストアンサー獲得回数18002012/04/03 09:38:16

ポイント70pt

ちょっと、スマートとは言い難いんだけど、NAME で並んで無くても大丈夫です。

SELECT * FROM (
  SELECT @tmp:=@tmp+1 SEQ, D.*
  FROM (SELECT @tmp:=0) DUMMY, NAME_AGE D
) NAME_AGE  
where SEQ >= (select SEQ from (
    SELECT @tmp:=@tmp+1 SEQ, NAME
      FROM (SELECT @tmp:=0) DUMMY, NAME_AGE
    ) NAME_AGE  
    where NAME = 'cccc')
limit 3

こんな感じで、動作します。
http://sqlfiddle.com/#!2/df2c9/3

id:dy7

回答ありがとうございます。
希望通りの動作を実現できそうです!(内容について、良く分からない部分もあるので、詳しく調べてみます。)
ありがとうございました。

2012/04/03 14:49:43
id:a-kuma3

面白そうなんで、むりやり SQL でやってみました。
件数が増えると遅くなりそうなんで、AUTO_INCREMENT な列をひとつ追加する、というのが現実的なやり方だとは思います。

2012/04/03 15:07:17

その他の回答(1件)

id:taknt No.1

きゃづみぃ回答回数13481ベストアンサー獲得回数11982012/04/03 06:13:59

ポイント50pt

where文の条件に NAME>='cccc' というのを入れて 先頭から3件とかでは どうでしょうか?

他2件のコメントを見る
id:dy7

昇順には並んでおらずバラバラの順番ですが、テーブル内のデータ順が固定であれば、意図したとおりに抽出(毎回同じ結果)できるのではないかと思うのですが、間違っていますか?
(order byを指定しない場合、並び順は一定ではないのでしょうか?)

自動連番のフィールドを用意して、taknt様にアドバイスいただいた方法をとるのが良いような気もしてきました。

2012/04/03 09:30:22
id:taknt

>自動連番のフィールドを用意して、taknt様にアドバイスいただいた方法をとるのが良いような気もしてきました。

固定でとれるならば 私も 連番を作って それで 抽出すればいいかと思います。

2012/04/03 09:33:40
id:a-kuma3 No.2

a-kuma3回答回数4363ベストアンサー獲得回数18002012/04/03 09:38:16ここでベストアンサー

ポイント70pt

ちょっと、スマートとは言い難いんだけど、NAME で並んで無くても大丈夫です。

SELECT * FROM (
  SELECT @tmp:=@tmp+1 SEQ, D.*
  FROM (SELECT @tmp:=0) DUMMY, NAME_AGE D
) NAME_AGE  
where SEQ >= (select SEQ from (
    SELECT @tmp:=@tmp+1 SEQ, NAME
      FROM (SELECT @tmp:=0) DUMMY, NAME_AGE
    ) NAME_AGE  
    where NAME = 'cccc')
limit 3

こんな感じで、動作します。
http://sqlfiddle.com/#!2/df2c9/3

id:dy7

回答ありがとうございます。
希望通りの動作を実現できそうです!(内容について、良く分からない部分もあるので、詳しく調べてみます。)
ありがとうございました。

2012/04/03 14:49:43
id:a-kuma3

面白そうなんで、むりやり SQL でやってみました。
件数が増えると遅くなりそうなんで、AUTO_INCREMENT な列をひとつ追加する、というのが現実的なやり方だとは思います。

2012/04/03 15:07:17

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません