MYSQLについて質問です。


現在データベースに入っているデータの中から
あるパラメータに属されているものを50個ずつLIMITで抽出するということをしています。

例)SELECT DATA1 FROM TABLE WHERE DATA2 = '1' LIMIT 0 , 50
上のSQL文ですときちんと50行表示してくれるのですが

SELECT DATA1 FROM TABLE WHERE DATA2 = '1' LIMIT 101 , 150
とすると100件近く表示されます。

SELECT DATA1 FROM TABLE WHERE DATA2 = '1' LIMIT 151 , 200
SELECT DATA1 FROM TABLE WHERE DATA2 = '1' LIMIT 201 , 251
として50件ずつ上手く抽出したいのですが、どんどん多く抽出されてしまいます。

対処方法を知っているかたおりましたら教えていただければと考えております。
よろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/02/11 07:35:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:chuken_kenkou No.1

回答回数722ベストアンサー獲得回数54

ポイント100pt

LIMIT句の使い方に誤解があるようです。

LIMIT [オフセット値,] 行数

です。

つまり、50行ずつ得たいなら、

先頭から50行・・・LIMIT 0,50

51行目から50行・・・LIMIT 50,50

101行目から50行・・・LIMIT 100,50

151行目から50行・・・LIMIT 150,50

といった指定になります。

id:aiomock

ご回答ありがとうございます。

2010/02/10 06:33:02

その他の回答4件)

id:chuken_kenkou No.1

回答回数722ベストアンサー獲得回数54ここでベストアンサー

ポイント100pt

LIMIT句の使い方に誤解があるようです。

LIMIT [オフセット値,] 行数

です。

つまり、50行ずつ得たいなら、

先頭から50行・・・LIMIT 0,50

51行目から50行・・・LIMIT 50,50

101行目から50行・・・LIMIT 100,50

151行目から50行・・・LIMIT 150,50

といった指定になります。

id:aiomock

ご回答ありがとうございます。

2010/02/10 06:33:02
id:ana_log No.2

回答回数114ベストアンサー獲得回数22

ポイント20pt

SELECT DATA1 FROM TABLE WHERE DATA2 = '1' LIMIT 101 , 150

SELECT DATA1 FROM TABLE WHERE DATA2 = '1' LIMIT 50 OFFSET 101

に変更してみてください。

※101行目から50行取り出す

順番が分からないので頭から取り出します。

ちゃんと並び変えた方がいいと思いますが・・・


参考

http://www.postgresql.jp/document/pg732doc/user/queries-limit.ht...

id:aiomock

ご回答ありがとうございます。

2010/02/10 06:33:13
id:phero No.3

回答回数55ベストアンサー獲得回数9

ポイント20pt

すでに回答者がおりますのでご不要かもしれませんが、

SELECT DATA1 FROM TABLE WHERE DATA2 = '1' LIMIT 100, 50

とすれば 101件目~150件目 の50件が取得可能です。

http://dev.mysql.com/doc/refman/5.1/ja/select.html

id:aiomock

ご回答ありがとうございます。

2010/02/10 06:33:19
id:b-wind No.4

回答回数3344ベストアンサー獲得回数440

ポイント20pt

対処法もなにも使い方間違ってるだけ。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.7 SELECT 構文

その2つの引数のうち、最初の物は返される最初の行のオフセットを指定し、2つめの物は返される行の最高数を指定します。冒頭の行のオフセットは0です。(1ではありません)

第二引数に指定するのは取得する「行数」。つまりこの場合50固定。

SELECT DATA1 FROM TABLE WHERE DATA2 = '1' ORDER BY DATA1 LIMIT 101 , 50;
SELECT DATA1 FROM TABLE WHERE DATA2 = '1' ORDER BY DATA1 LIMIT 151 , 50;
SELECT DATA1 FROM TABLE WHERE DATA2 = '1' ORDER BY DATA1 LIMIT 201 , 50;

order by が抜けているのはすでにコメントで指摘されているとおり。

id:aiomock

ご回答ありがとうございます。

2010/02/10 06:33:26
id:km1967 No.5

回答回数541ベストアンサー獲得回数40

ポイント20pt

50件ずつ抽出したいなら下記のようにしなければならない。

SELECT DATA1 FROM TABLE WHERE DATA2 = '1' LIMIT   1, 50;
SELECT DATA1 FROM TABLE WHERE DATA2 = '1' LIMIT  51, 50;
SELECT DATA1 FROM TABLE WHERE DATA2 = '1' LIMIT 101, 50;
SELECT DATA1 FROM TABLE WHERE DATA2 = '1' LIMIT 151, 50;
SELECT DATA1 FROM TABLE WHERE DATA2 = '1' LIMIT 201, 50;
id:aiomock

ご回答ありがとうございます。

2010/02/10 06:33:38
  • id:chuken_kenkou
    2010-02-09 23:13:02の回答は、そのまま訂正はありません。

    ORDER BY指定がないと、順序は保証されません。

    select ・・・
    from 表名
    where 検索条件
    order by 列名
    limit m,n

    必ず "order by"を指定してください。そうしないと、どういう順序で返るかはMySQLはまったく保証しません。仮に期待通りであっても、それは偶然うまくいっているだけです。
  • id:taknt
    ORDER BYをつけないとダメなんじゃない?

    http://mt.orz.at/archives/2009/04/mysqllimit.html
  • id:aiomock
    皆さんご回答ありがとうございます。
  • id:heke2mee
    テーブルもロックしないと危険ですね

    LOCK TABLES TBL READ;

    SELECT DATA1 FROM TBL WHERE DATA2 = '1' ORDER BY ユニークなキー項目 LIMIT 1, 50;
    SELECT DATA1 FROM TBL WHERE DATA2 = '1' ORDER BY ユニークなキー項目 LIMIT 51, 50;
    SELECT DATA1 FROM TBL WHERE DATA2 = '1' ORDER BY ユニークなキー項目 LIMIT 101, 50;
    SELECT DATA1 FROM TBL WHERE DATA2 = '1' ORDER BY ユニークなキー項目 LIMIT 151, 50;

    UNLOCK TBL;

    こんな感じかな?間違ってたら訂正してください
  • id:b-wind
    >テーブルもロックしないと危険ですね
    質問を見る限りでは一度に取得するのはあくまで50件と読める。
    数百件を取り出したければ最初からそんなクエリにするだろうし。

    理解が間違っていなければロックを取得する意味がない。
  • id:chuken_kenkou
    LIMITで先頭行から検索するには、「 LIMIT 1,n 」でなく、「 LIMIT 0,n 」なので注意してください。

    すなわち、LIMIT m,n は、m+1 行目から n 行を得ることになります。

    SELECT * FROM tbl where 検索条件 order by clm1 limit 0,50 -- 1行目から50行
    SELECT * FROM tbl where 検索条件 order by clm1 limit 50,50 -- 51行目から50行    

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

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

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

回答リクエストを送信したユーザーはいません