MySQLの検索について

このQ&Aのポイント
  • MySQLの検索についての方法とその最適化について解説します。
  • MySQLの検索について、1ページに表示するnameの数を指定し、nameごとにpriceでソートする方法を探しています。
  • クエリを2回発行せずに、1度で実現するためのSQLやより効率的な方法があれば教えてください。
回答を見る
  • ベストアンサー

MySQLの検索について

MySQLの検索について id | name | price 1 | A | 100 2 | B | 1200 3 | A | 150 4 | A | 175 5 | B | 1150 6 | C | 500 7 | C | 600 8 | D | 300 仮にこのようなテーブルがあったとします。 このテーブルを、以下の形で出力したいのです。 A | 100 A | 150 A | 175 B | 1150 B | 1200 C | 500 C | 600 next page(D以下は次のページ以降で表示) つまり、nameの項目は指定した項目数だけを出力。 1ページに表示するnameの数は決まっている。 ただし、表示されるnameにあたるレコードは数に関係なく全て出力し、nameごとにpriceでソートする。 クエリーを2回発行し、プログラム側での処理を交えれば実現できるのですが、できればDBに問い合わせる回数は減らしたいと考えています。 上記の事を1度で実現するSQLが存在する、あるいはより優れたやり方があるのでしたら、ご教授いただければ幸いです。

  • MySQL
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>nameでソートした順に表示で間違いありません。 仕様としてはnameを3つ見せ、順位はname昇順、price昇順ということで SELECT ( SELECT COUNT(DISTINCT name) +1 FROM hoge AS H2 WHERE H2.name < H1.name ) AS RANK ,`H1`.* FROM hoge AS H1 HAVING RANK BETWEEN 1 AND 3 ORDER BY name,price でいけます。また HAVING RANK BETWEEN 1 AND 3 の範囲設定を調整すれば、好きな順位のデータだけ抜けだせます。

bulldozerQ
質問者

お礼

上記のSQLを参考に、まさに考えていた通りのことができました。 ありがとうございました。 分かりにくい文章にもかかわらずここまで的確な解答をいただき感激です。 それにしてもSQLというものは奥が深いですね… 自分ではとうてい考えつきそうにもないSQL文でした…

その他の回答 (2)

  • moousi
  • ベストアンサー率70% (21/30)
回答No.3

Rankを付けたり、limitで制御しても実現できそうですが、 >上記の事を1度で実現するSQLが存在する 結局ページごとにSQLを発行するなら、1度で実現することにならないと思うのです。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>1ページに表示するnameの数は決まっている。 この場合nameのとはA,B,Cの3行という意味でしょうか? それとも6行という意味でしょうか? 仮に前者として、nameでソートした順に表示すればいいのでしょうか?

bulldozerQ
質問者

補足

分かりにくい説明になってしまいすいません。 nameでソートした順に表示で間違いありません。

関連するQ&A

  • php 重複データ処理

    以下のtableを取得しています。 id   qty   name   price ___________________________________ 1    1    A    100 2    1    B    100 3    4    C    200 4    4    D    30 5    5    E    450 6    6    F    20 7    9    G    600 8    9    H    120 9    9    I    90 htmlのtableでrowspanを使って下記のように 出力するにはどうすればよいでしょうか? (qtyの1が1段結合、9が3段結合させ、 nameとpriceは結合なしというふうになってます。) qty | name | price ______________________ 1  |  A  | 100    _________________    |  B  | 100 ______________________ 4  |  C  | 200    _________________    |  D  | 30 ______________________ 5  |  E  | 450 ______________________ 6  |  F  | 20 ______________________    |  G  | 600    _________________ 9  |  H  | 120   _________________    |  I  | 90 ______________________

    • ベストアンサー
    • PHP
  • [MySQL+PHP] 検索結果をカテゴリー毎に表示したい

    以下のようなデータベースのテーブルデータを、カテゴリごとに出力したいのです。 <TABLE1> ---------------------- pref_ID  pref ---------------------- 001   東京 002   埼玉 003   神奈川 004   千葉 ---------------------- <TABLE2> ---------------------- pref_ID area name ---------------------- 001   新宿  A 001   池袋  B 001   新宿  C 002   大宮  D 003   横浜  E 003   川崎  F ---------------------- これを、phpで、テーブルを使用して以下のように出力したいのです。 ------------------ | 東京   | 埼玉  | ------------------ | 新宿 A | 大宮D  | | 新宿 C |     | | 池袋 B |     | ------------------ | 神奈川 |     | ------------------ | 横浜 E |     | | 川崎 F |     | ------------------ となるよう(列数は可変)に表示は出来るのでしょうか? 使用する PHPのバージョンは4.3.11 Mysqlのバージョンは4.0.24 です。 宜しくお願い致します。

  • MySQL,PHPを使いデータとデータ件数を取得する関数

    よろしくお願いします。 このようなテーブルがあります。 テーブル名GAME id name    price  genre_id  comment 1 FF1    100  1  おもしろい 2 カービー 200 3 丸い赤 3 バイオ   250 2 怖い : : : : : テーブル名GENRE genre_id genre_name 1 RPG 2 ホラー 3 バイオ このようなテーブルがあるとして、 検索したいカラム(id,name,g_id,comment)に対して検索キーワードに部分一致をしたものデータからソートしたいカラムと昇順降順のようにソートしページ数から (ページ数-1)*10+1 ~ ページ数*10 最終ページのときは (ページ数-1)*10+1 ~ 最終ページ の部分のデータを取得する関数を作りたいです。表示するデータは id name genre_name です。 ページャーも使うので検索カラムにたいして検索ワードに部分一致した結果件数も戻り値として返したいです。 上記のsql文を教えてください。 またデータと結果件数を返す関数を作ることは可能でしょうか? 関数の引数は以下のように5つにするつもりです。 function getList($search_column,$search_word,$sort_column,$sort_order,$page_number) どうかご教授ください。

    • 締切済み
    • PHP
  • MySQLでのあいまい検索について、教えてください。

    MySQLでのあいまい検索について、教えてください。 長いですが、最後までお付き合いください。 今、入っている全データは、以下の通りです。 fieldはnum,nameです。 1 あいうえお 1 かきくけこA 1 さしすせそB 1 たちつてとC 1 まみむめもF 2 あいうえお 2 かきくけこA 2 さしすせそB 3 わおん 3 らりるれろA 3 たちつてとC 3 なにぬねのD 4 かきくけこA 4 はひふへほE 4 まみむめもF 5 Aあいうえお 6 あいAうえお 7 あい A うえお ここから、あいまい検索でnameに「A」を含むものを抽出したいので、 select num, name from ○○ where name like '%A%' order by num; としました。すると出てくるのは、 1 かきくけこA 1 たちつてとC 1 まみむめもF 2 かきくけこA 3 らりるれろA 3 たちつてとC 4 まみむめもF 4 かきくけこA 5 Aあいうえお 6 あいAうえお 7 あい A うえお が出てきてしまいます。「A」が含まれる物は全て出ますが、それ以外の物まで出ます。 また、「C」で同じことをすると、 1 たちつてとC 3 らりるれろA 3 たちつてとC 「E」では、 3 らりるれろA 3 なにぬねのD 4 はひふへほE 「D」でも別の物が出てきます。しかし「B」「F」は正常に出ます。 他にも、ひらがな「に」でやってみても、 3 らりるれろA 3 なにぬねのD と出ます。 なぜ、このようになってしまうのでしょうか? あいまい検索の仕方を間違っているのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 二つの表の項目を比較して値を取得するSQL

    お世話になります、 二つの表の項目を比較して値を取得するSQLを作成しているのですが、うまくいきません。 具体的には Aテーブル NAME | PRICE ------|------ リンゴ | 100 ------|------ オレンジ | 200 ------|------ ブドウ | 300 ------|------ Bテーブル NAME | PRICE ------|------ リンゴ | 1000 ------|------ オレンジ | 200 ------|------ ブドウ | 1300 ------|------ という二つのテーブルA、Bがあったとします。 このA,Bの二つのテーブルのそれぞれの果物のPRAICEを比較してBのPRICEがアップしている果物を出力するという SQLを教えてください。 <ほしい結果> NAME | PRICE ------|------ リンゴ | 1000 ------|------ ブドウ | 1300 よろしくお願いします。

  • サブクエリを使わずにこんな処理はどうすれば(HELP!)

    DB初心者の私、サブクエリの使えないMySQL4.0+PHPでWebシステムを構築しようとしていますが、以下のようなことで困っています。 以下のような販売データのDBがあるとします(あくまで例です)。 ---------------- product shop ---------------- A    a B    a C    b A    c B    d D    c D    b C    a C    a C    a B    a ---------------- このproductを、shop='a'のレコードに絞込み、その他のshopを含めた販売数の多い順にソートして出力したいのです。 上表の例では、productのA,B,Cがshopのaで売れており、全体では、Cが4個,Bが3個,Aが2個売れているので、C,B,Aという順序に出力したいのです。 こんな処理がMySQLでサブクエリを使わず書けるでしょうか? 実際に扱うデータはもっと複雑で、productの種類もレコード数も多く、1ページ10 productずつなど、複数ページに亘って表示させたいです。 しかし、PHP側でソート処理を行う場合、セッションなどを用いて、ページ間でデータを引き継がなくてはなりません。 いろいろ調べると基本、ページ毎にクエリを投げるほうがよいということらしいので、できればPHPのページごとにクエリを投げて、MySQL側でソートまでしてもらい、PHPではその結果を受け取って表示するだけという形にしたいと思っているのですが。。。 素人なもので、行き詰っています。どなたかのお知恵を拝借したく、よろしくお願いします!

    • ベストアンサー
    • MySQL
  • mysqlのsql文について質問です

    tbl_aとtbl_bから、tbl_cを作りたいのですが どのようなsql文を書けば良いでしょうか? アドバイス頂けると嬉しいです。よろしくお願い致します。 テーブル:tbl_a ----------------- code1,code2,name ----------------- 001,a,あ 002,a,あ 003,a,あ 004,a,あ 005,b,い 006,b,い 007,b,い 008,c,う 009,c,う 010,c,う 011,c,う 012,d,え 013,d,え 014,d,え テーブル:tbl_b ----------------- code1,point ----------------- 003,10 004,2 008,10 009,5 011,20 テーブル:tbl_c ----------------- code2,name,point ----------------- a,あ,2 b,い, c,う,5 d,え,

    • ベストアンサー
    • MySQL
  • SQL文

    SQLの初心者です。 Aテーブル(a項目,b項目,c項目)とBテーブル(a項目,d項目,e項目)のテーブルがあります。 d項目順でAテーブルの項目のみ出力するにはどうしたらいいのでしょうか。 例えば次のSQL文ではd項目順で出力されますが結合の為、AテーブルとBテーブルの全項目が出力されます。 SELECT * FROM Aテーブル LEFT OUTER JOIN DITKM ON Aテーブル.a項目 = Bテーブル.a項目 ORDER BY Bテーブル.d項目 次のSQL文のようにAテーブルの項目を選択したらAテーブルの項目のみ出力する事はわかります。 SELECT a項目,b項目,c項目 FROM Aテーブル LEFT OUTER JOIN DITKM ON Aテーブル.a項目 = Bテーブル.a項目 ORDER BY Bテーブル.d項目 今回はAテーブルの項目数が少ないのでこれでもいいのですが、項目数が多くなると大変です。 上の様に項目を選択しないでAテーブルの項目を全て出力する事は可能なのでしょうか。 宜しくお願い致します。

  • SQLを教えて下さい

    SQL文を教えて下さい 以下の2つのテーブルがあります。 TABLE1 --------------- ID,NAME,PRICE --------------- 1,部品A,100 2,部品B,200 3,部品C,300 TABLE2 --------------- ID,NAME,PRICE --------------- 1,部品Aのサブ1,1 1,部品Aのサブ2,2 2,部品Bのサブ1,5 2,部品Bのサブ2,5 --------------- SELECT TABLE1.NAME TABLE2.NAME TABLE1.PRICE TABLE2.PRICE WHERE TABLE1.ID = TABLE2.ID(+) TABLE2.PRICE = (SELECT MAX(?) ?) 期待する結果 ・TABLE1.NAME = 部品Aの場合 --------------- 部品A,部品Aのサブ2,100,2 ・TABLE1.NAME = 部品Bの場合 --------------- 部品B,部品Bのサブ1,200,5 TABLE1.NAME = 部品Cの場合 --------------- 部品C,,300, ・TABLE1のNAMEに、TABLE2のNAMEが関連付く(付かないものもある) ・外部結合とMAX関数を用いたい。 ・TABLE2のPRICEが大きい方を取得(同一の場合は、どちらかを取得)

  • SQLがわかりません。

    以下のTESTテーブルから以下の結果を表示するようなSQLを教えて頂けないでしょうか。 TESTテーブルでTYPE(1,2,3)を抽出して、2,1,3の順番にして それぞれのTYPEごとにDBIDでソートをしたいです。 どうかよろしくお願いいたします。 table TEST DBID | NAME | TYPE ------------------------------- 1 | A | 1 2 | B | 2 3 | C | 3 4 | D | 4 5 | E | 1 6 | F | 2 7 | G | 3 8 | H | 4 9 | I | 1 10 | J | 2 結果 DBID | NAME | TYPE ------------------------------- 2 | B | 2 6 | F | 2 10 | H | 2 1 | A | 1 5 | D | 1 9 | G | 1 3 | D | 3 7 | G | 3