人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

例えば、以下のようなテーブルがあったとすると、
ーーーーーーーーーー
NAME , AGE
ーーーーーーーーーー

aaaa , 21
bbbb , 25
cccc , 30
dddd , 21
eeee , 49
ffff , 34

ーーーーーーーーーー
NAME='cccc'のレコードから3件を抽出する、といった感じです。

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

●質問者: dy7
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● きゃづみぃ
●50ポイント

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


dy7さんのコメント
回答ありがとうございます。 また、誤解が生じる例で失礼いたしました。NAMEは昇順に並んでいるわけではなく、実際にはバラバラです。

きゃづみぃさんのコメント
バラバラの場合、毎回 意図した状態で抽出できるとは 限りませんよ。 たとえば ↓という場合もありうる。 ーーーーーーーーーー NAME , AGE ーーーーーーーーーー … dddd , 21 eeee , 49 cccc , 30 aaaa , 21 bbbb , 25 ffff , 34 … ーーーーーーーーーー

dy7さんのコメント
昇順には並んでおらずバラバラの順番ですが、テーブル内のデータ順が固定であれば、意図したとおりに抽出(毎回同じ結果)できるのではないかと思うのですが、間違っていますか? (order byを指定しない場合、並び順は一定ではないのでしょうか?) 自動連番のフィールドを用意して、taknt様にアドバイスいただいた方法をとるのが良いような気もしてきました。

きゃづみぃさんのコメント
>自動連番のフィールドを用意して、taknt様にアドバイスいただいた方法をとるのが良いような気もしてきました。 固定でとれるならば 私も 連番を作って それで 抽出すればいいかと思います。

2 ● a-kuma3
●70ポイント ベストアンサー

ちょっと、スマートとは言い難いんだけど、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


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

a-kuma3さんのコメント
面白そうなんで、むりやり SQL でやってみました。 件数が増えると遅くなりそうなんで、AUTO_INCREMENT な列をひとつ追加する、というのが現実的なやり方だとは思います。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ