データベース(以下、DB)は、SQLite2です。
PHPスクリプトの中で利用しています。
なお、本質問はMySQLとして説明して頂いても結構です。
(恐らく、同じような方法で解決できると思いますので。)
考え方が分かりましたら、あとは自分で調べられますので、
その方向性だけを示して下さるというのでも結構です。
さて、質問に移らせて頂きますが、
DBに検索をかけ、ヒットしたレコードを、
ある特定のカラムをもとにソートし、その中の上から指定件数分抽出する
ということをしたいと考えています。
例をあげます。
テーブル名(tbl_siritori)
id word cate
1 りんご 食べ物
2 ごりら 動物
3 らくだ 動物
4 ダック 動物
5 くり 食べ物
6 リス 動物
7 スイカ 食べ物
8 カメ 動物
9 メロン 食べ物
というDBがあったとして、
このDBに、[cate]に「食」という文字が入っているようなデータを、
[id]順に見て、大きな数字のものを上から3件抽出したい場合、
どのような方法(SQL文)が考えられますか。
3件のデータを表示した後、
さらにそれに続く3件のデータを次ページに表示、
さらにそれに続く3件も同様にさらに次ページに表示…(略)
ということをしようと思っています。
1ページに3件、で、何ページにも渡ってデータを3件ずつ出力していく、ということです。
以上のことを実現可能であるSQL文の中でも、
最も一般的なものを教えて下さい。
$query =
"SELECT * FROM tbl_siritori WHERE (cate LIKE '%食%') ~~ごにゃごにゃ~~ ORDER BY id DESC";
というような書き方で、1文で解決できるものと思っていますが、
複数の文で絞り込むような形になるのでしょうか。
以上、よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
LIMIT [x,]y
あるいは
LIMIT y OFFSET x
検索条件で絞り込まれ、ORDER BYでソートした結果のx+1行目(先頭は0)からy行を得るという指定です。
ORDER BYがないとMySQLは結果を返す順を保証しないので、LIMITを使用する場合は、通常は必ずORDER BYと組み合わせて使用します。
また、検索条件とORDER BYの組み合わせ等でインデクスを有効利用できれば、インデクス上で「x+1番目からy行」を見つけられるので、性能が極端に落ちません。しかし、逆にインデクスでなく母体データをサーチしなければならないような場合は、母体データ件数が多いと、OFFSETで検索対象をスキップするのに大幅に性能劣化するので注意しましょう。
select ~
from t1
[where 検索条件]
ORDER BY ソートの指定
LIMIT 0,3
とした場合、該当する行の先頭(OFFSET 0)から3行が検索結果として得られます。
select ~
from t1
[where 検索条件]
ORDER BY ソートの指定
LIMIT 3,3
とした場合、4行目(OFFSET 3)から3行が検索結果として得られます。
さらに、7行目からは LIMIT 6,3 といったように指定します。
SELECT文の構文については、下記参照。
http://dev.mysql.com/doc/refman/5.1/ja/select.html
どういった検索条件やORDER BYの指定だと、インデクスを効率的に使用できるかは、下記参照。ただし、MySQLの話しです。
http://dev.mysql.com/doc/refman/5.1/ja/query-spe …
この回答への補足
さらなるアドバイスをありがとうございます!
select ~
from t1
[where 検索条件]
ORDER BY ソートの指定
LIMIT 0,3
これで、出来ました!
まさに、このまんまで!
(ちなみに、indexは今のところ使用していません)
とても助かりました。
出来ないものと思っていたので、嬉しいです~。^^
どうもありがとうございました!
No.4
- 回答日時:
#3の文言を、一部訂正します。
<訂正前>
母体データ件数が多いと、OFFSETで検索対象をスキップするのに大幅に性能劣化する
<訂正後>
母体データ件数が多かったり、検索対象行が多いと、ORDER BYでのソート及びOFFSETで検索対象をスキップするのに大幅に性能劣化する
No.2
- 回答日時:
SELECT文で、LIMIT句、あるいは「LIMIT句とOFFSET句」を組み合わせればいいのでは?
この回答への補足
簡潔なアドバイスをありがとうございます。笑
>「LIMIT句とOFFSET句」を組み合わせればいいのでは?
OFFSET句というのが、どのようなものか知らなかったので、ざっくり調べてみました。
まだよく分かりませんが、スキップができるようですね。
このスキップがどう利用価値のあるものなのか、また、その使い方について分からないので、もしよろしければ教えて頂けると大変ありがたいです。
もちろん自分でもさらに調べてみますが、、。笑
ちょっと希望の光が見えてきたような気がします。
今後の展開が楽しみです。
No.1
- 回答日時:
私も、同じようなことをやろうとしましたが。
。。見つかりませんでした。
top、not in、unionなど試しました。
Oracleなら簡単な方法があったのですが・・・ orz
私の解決策としては、SQL文で処理するのではなく、プログラムで処理しました。
この回答への補足
どうもです、mako_tyoさん。
>私も、同じようなことをやろうとしましたが。。。
とのことなので、恐らく、ご自身で検索はもちろんのこと、質問の投稿までされたのだと思います。
そして、このような回答をして頂いたのだと思います。
恐れ入ります。
>top、not in、unionなど試しました。
私はまだ何も動き出していない状態なので、ひとまず、
上記の方法 top,not in,union には近づかないようにします。(笑)
>Oracleなら簡単な方法があったのですが・・・ orz
オラクルについては、知識0なので、どうにもこうにも・・・ora (オラクルバージョンorz)
>私の解決策としては、SQL文で処理するのではなく、プログラムで処理しました。
最終手段である北斗神拳を使われてしまったわけですね。
私も同じ道を辿ることになるのだろうか・・・
ちょっとふざけすぎましたが、真面目に文章を打ち込んでいますので、
怒らないで下さいね!笑
おそらく、プログラムで処理するとなると、
まず、抽出したいものを通常通り抽出し、それらを
1,新たにDBを用意してそれにぶちこんで、そこでソートして抽出するか、
2,配列か何かにぶち込んで、同様にソートして抽出するか、
そのような方法になるのでしょうね。
1の方法は、よほど複雑な場合を除き、避けたいですね。
というか、プログラムで処理する場合でも、
上に挙げた1,2の方法よりも、もっと良い方法がありそうですよねw
それについて、新たに質問すべきなのかしら。
頻繁にする検索動作だけに、やはり、それなりに効率的なものを、
最初の段階でしっかり設計しておきたいですからね。
もし余力がありましたら、最終的にどう決着されたのか、
その方法について教えて頂けると嬉しいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP php my adminより取り出したデータ表示 2 2022/06/15 11:56
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP PHP ページング データベース 1 2022/06/16 10:30
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
検索結果を指定件数ずつ抽出表...
-
レコードの登録順がおかしい
-
ファイルの漢数字の順番につい...
-
並べ替えについて
-
EXCELで4項目以上で並べ替えを...
-
上から何番目か。
-
エクセル、並び替え正しくソー...
-
コンボボックスのソートについて
-
<SQL>重複しているデータの場合...
-
テーブルのフィールドの一番長...
-
2回実行のSQL文を1回にしたい
-
BLOBやCLOBのパフォーマンスを...
-
「数字で始まらない」ものを抽...
-
select文の実行結果に空白行を...
-
oracle 2つの列の比較
-
SQL文 複数実行
-
【SQLサーバ】float型における...
-
単一グループのグループ関数で...
-
BLOB型項目をSQLの検索条件に指...
-
OUTER JOIN とgroup by
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイルの漢数字の順番につい...
-
並べ替えについて
-
エクセル、並び替え正しくソー...
-
レコードの登録順がおかしい
-
月末日のみソートしたい
-
accessでDISTINCT 句と矛盾
-
テーブルレーコードをソートし...
-
エクセルの縦列のソートできま...
-
Selectした時のレコードの取得順
-
SQLで曜日のソートを月火水木金...
-
OracleとAccessの出力順の違い
-
アクセスに関して。クエリの並...
-
1の行を固定した上でVBAを用い...
-
ハイフンの入ったデータの並べ替え
-
文字型の順番がうまく並ばない。
-
都道府県順、北からソートした...
-
上から何番目か。
-
SQLのORDERBY句について質問です。
-
コンボボックスのソートについて
-
Excelのオートフィルタでソート...
おすすめ情報