• ベストアンサー

一度検索されたものに対するソートについて

こんにちは。php+mysqlで検索サイトを作っているんですが、初心者であり、スクリプトの書き方で困ってます。 「まず検索されたデータをweb上に表示させる。 表示された表のヘッダ部分(各名称)をクリックすると、表示されたものがソートされる。」 以前、各名称をクリックすることでソートさせるやり方が、掲載されていたのですが、一度検索条件によって出されたものに対しては、どのようにスクリプトを書けばよいのでしょうか?どなた様か教えていただけませんか? もうひとつ、これはいろいろ調べたことなんですが、表示された表のヘッダ部分を固定させて、ボディ部分だけをスクロールさせることは難しいのでしょうか? 分かりにくい質問ですみません。宜しくお願い致します。

  • PHP
  • 回答数5
  • ありがとう数1

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

  • ベストアンサー
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.5

$sql= "create temporary table tmp select * from honda where (model like '$model%') having (model like '%$grade%')"; $sql= "select * from tmp where (model like '$model%') having (model like '%$grade%')"; $rst = mysql_query($sql,$con); これだと tmptable を作るためのクエリーがないので当然エラーになります。 変数に入れただけでは実行されないので、SQL文を実行してください。 $sql= "create temporary table tmp select * from honda where (model like '$model%') having (model like '%$grade%')"; $rst = mysql_query($sql,$con); $sql= "select * from tmp where (model like '$model%') having (model like '%$grade%')"; $rst = mysql_query($sql,$con);

briantaphy
質問者

お礼

ご回答有難うございました。そんな簡単なところでつまづいていたのですね。 お恥ずかしい。 #5さんはもちろん、皆さんのアドバイスを参考にさせて頂いて、ようやく頭に描いてたスクリプトが出来上がりました。 本当に有難うございました。

その他の回答 (4)

回答No.4

再ソートですが、簡単なSQLであればソートの度にorder指定を変えて再検索する方法で良いと思います。 もしSQLが重く、ソートを変更する度に実行するのが辛ければ、表示用のテーブルを作ってそこにselect結果を一旦保存、条件に応じてorder byでソートして表示するのが良いと思います。表示用のテーブルを作る方法は再ソートのためだけでなく、複雑なSQLを使ってページングをする際、ページが変わる度に重いSQLの実行を避ける為だったり、頻繁に件数が増えるため、ページが切り替わる度にSQLを実行すると表示されないレコードが発生してくる(ページを切り替える度に件数が変わると、ページングの位置も変わり抜けるレコードが出てくる)のを防ぐなど、SQLで得たデータ以外の別の要素でのソートが必要な場合などの色々な目的で、割とよく使う手法です。 他のテーブルのselectの内容をそのまま別のDBに挿入する場合はinsert into xxx select aaa,bbb,ccc from yyyy where~の構文でできます。 データ件数が少なければ、結果をフィールド毎の配列に入れて、array_multisort関数で配列をソートします。こちらの方が手軽ですね。

  • kaiu
  • ベストアンサー率20% (65/315)
回答No.3

こんにちは。 (1)<a href=file2.php?flag=1>などでフラグを立てて if文かswicthで分岐させて select * from * order by * などで。 DBを使いたくないのならjavascriptでも出来無い事もないですが、 猥雑になると思います。 http://www.openspc2.org/reibun/javascript/ (2)フレームの事ですか? htmlで簡単にできます。 下記リンクご参考に。 http://www.tagindex.com/html_tag/frame/index.html

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

・ソートについて Mysqlで表示された検索結果は、PHPで表示されてPHPの処理が終わればMysqlの処理も終了します。 つまり、一度検索条件で出されたとしても、その検索結果からさらに絞り込むと言うことはできません。 やるのでしたら、今やった検索処理+新たな検索処理をする、と言うことです。 つまり、Mysqlのorder by 句のソート項目が変更される、where句がいくつか増えるまたはtmptableを使用するということをするようになると思います。 ・表示 ヘッダ部分を固定してボディー部分をスクロールさせる手としては、フレームで分けてしまう手があります。 ただし、上下ともサイズ固定をしておかないと表がずれます。

briantaphy
質問者

補足

ご回答有難うございます。 tmptable の使用ですが、tmptable を作成してそれを表示させるには2度クエリを発行しなければならないですよね(create文とselect文?)、 そこは普通に $sql= "create temporary table tmp select * from honda where (model like '$model%') having (model like '%$grade%')"; $sql= "select * from tmp where (model like '$model%') having (model like '%$grade%')"; $rst = mysql_query($sql,$con); と二つならべるんですか?これは勿論エラーでましたけど。 すいませんが、その辺について教えてください。

  • 9arabi
  • ベストアンサー率32% (140/433)
回答No.1

PHPだと、一度WEB上に表示した(DBから取得してきた)データを、DBに再度接続せずにソートするのはできなかったと思います。 (.NETなら非接続での方法があるので別ですが) なので、再度DBに対して検索する必要があるかと思います。 >表示された表のヘッダ部分を固定させて、ボディ部分だけをスクロールさせる ボディ部分とヘッダ部分のHTMLをまずわけ、 ボディ部分を <div style="height:200px;width:200px;overflow:auto;"> ここにボディ部分を入れる </div> とすれば、スクロールされます。 スタイルシートがきく環境で、だけですが。 heightとwidthを変えればよいです。

関連するQ&A

  • 検索後のソートについて

    PHP、MySQL、初心者なのですが、現在検索アプリの作成にチャレンジしておる者です。 こちらの過去ログを参考にさせていただいたのですが、どうしても検索後のソートがうまくいきません。 一度検索されたものに対するソートについて http://oshiete1.goo.ne.jp/kotaeru.php3?q=1482358 上記の過去ログを参考に、「create temporary table tmp」の箇所を 自分のサイトに置き換えて試してみたのですがうまくソートができず、 ついに力尽きてしまいました。 静的に表示させた場合、表示された表のヘッダ部分(各名称)をクリックすると、 表示されたものはソートできるようにはなったのですが... $sql = "SELECT * FROM perfume where shohin_name like '%$word%' "; 通常は上記のように検索フォームに入力した語句(変数(word))を受け取って表示させています。 過去ログを参考に $sql = "create temporary table tmp SELECT * FROM perfume where shohin_name like '%$word%' "; としては見たのですがうまくいきません。 どなたか正しいスクリプトの書き方を教えていただけないでしょうか? ご教授、宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • 検索のソートについて

    以前phpのカテゴリ内で以下のようなQ&Aをみつけましたが、まったく同じ状況で使用する言語がperlの場合どのようにすればいいのでしょうか?どなたか教えて下さい。 "PHP+MySQLを勉強中です。 例えば、商品テーブルに商品ID、商品名、価格、在庫数の4つのフィールドがあって、その表の各名称をクリックするとソート(例:オークションなどで現在価格をクリックするとソートなど[select * from 商品 order by 価格 asc])できるスクリプトをどのように作成すればよいか教えて下さい。" "shohin.phpで商品一覧を表示するとして、フィールド各名称のリンクを <a href="shohin.php?sort=1">商品ID</a><a href="shohin.php?sort=2">商品名</a>・・・ のようにします。" あとはswitch文を使ってget値(sort=の値)別にクエリーを変えるだけです。

    • ベストアンサー
    • Perl
  • PHP+MySQLでのソートについて

    PHP+MySQLを勉強中です。 例えば、商品テーブルに商品ID、商品名、価格、在庫数の4つのフィールドがあって、その表の各名称をクリックするとソート(例:オークションなどで現在価格をクリックするとソートなど[select * from 商品 order by 価格 asc])できるスクリプトをどのように作成すればよいか教えて下さい。

    • ベストアンサー
    • PHP
  • 検索結果のテーブルの各カラムヘッダをキーにソートしたい

    上が検索フォーム、下が検索結果のように、画面を横割りにフレーム分割しています。 この検索結果リストの各カラムヘッダにハイパーリンクを仕込んで、 それをクリックするたびに昇順⇔降順でソートさるようにしたいですが、 PHP側をどのように改造する必要がありますでしょうか? 下記の例では、価格、書名がリンクになるイメージです。 【上段フレーム: search_form.htm】 <HTML> <HEAD></HEAD> <BODY> <FORM method="POST" action="list.php" target="result_list"> 書名<INPUT size="44" type="text" name="title"> を含む <INPUT type="submit" name="exec" value="検索"> </FORM> </BODY> </HTML> 【下段フレーム: result_list.php】 <?php $con = mysql_connect(DBSERVER, DBUSER, DBPASSWORD); $selectdb = mysql_select_db(DBNAME, $con); $sql = "select * from bookdb where (title like '%$title%') order by price"; $rst = mysql_query($sql, $con); $recmax = mysql_num_rows($rst); $body = "<B>$recmax 冊みつかりました。</B>"; $body .= "<TABLE border='1'> <TR> <TD>価格</TD> <TD>書名</TD> <TR>\n"; while($col = mysql_fetch_array($rst)) { $body .= "<TR>\n"; $body .= "<TD>" . $col["price"] . "</TD>\n"; $body .= "<TD>" . $col["title"] . "</TD>\n"; $body .= "</TR>\n"; } $body .= "</TABLE>\n"; mysql_free_result($rst); $con = mysql_close($con); ?> <HTML> <HEAD></HEAD> <BODY> <?= $body ?> </BODY> </HTML> ■ 環境 PHP 5.0.4 Win MySQL mysql 4.0.14b Win ■知識レベル: HTMLタグ打ち、初歩的なSQLを理解できる程度、PHP他プログラミング知識なし

    • ベストアンサー
    • PHP
  • MySQLで複数データベースの検索/ソートについて

    お世話になっております。 PHP4.4.1+MySQL4.1.15を使用しております。 複数のデータベースに含まれる複数のテーブルをひとつの大きなテーブルとして検索/ソートする方法はありませんでしょうか? 結合ではなく、全レコードを全て単体として検索/ソートをかけたいのです。 それぞれのデータベースに含まれるテーブルに、共通の項目があり、その共通の項目順にソートしたり、絞込をかけたりしたいのですが、調べてみても、どうしても結合(JOIN)に行き着いてしまいます。 JOINによる結合だと、共通の項目以外のレコードが表示されないので、これでは意味をなしません。 ご教授の程、お願い致します。

    • ベストアンサー
    • MySQL
  • <table>の<thead>を固定したい。

    JSPで画面を生成しているのですが、検索結果の表で表のヘッダー部分を固定して表示したいのですが・・・。 表を作っている部分と別にテーブルをつくり表題だけを表示してみたのですが、縦スクロールに反応しないのはいいとして横スクロールに反応しないのが問題点で何とか横スクロールに連動できないか調べてるところです。 よろしかったら誰か教えてください。

    • ベストアンサー
    • HTML
  • 多機能なテーブルの実現方法

    現在、WindowsXP、PHP、PostgreSQLでwebアプリケーションを作成しており、DBから読み込んだデータを一覧表示する部分があります。 表示のみではなく、テキストボックス、コンボボックスなども組み込まれており、行の追加、削除、テキストボックス、コンボボックスの内容を変更することが可能です(更新ボタン押下で編集した内容がDBに反映されます)。 このtable部分に「ヘッダ固定の縦スクロール」「同横スクロール(これはヘッダ固定でなくても可)」「ヘッダクリックでソート」という機能を付加したいのです。 出力部分は<tr><td>~</td></tr>でデータを繰り返し出力しており、xml等は使用していません。現在のソースに対してできるだけ修正部分を少なく済ませたいです。フレームワークはprototype.jpを使っているので、これに依存するものは使用可能です。もちろん、フレームワーク依存でないものも可能です。 ttp://tetlaw.id.au/view/blog/table-sorting-with-prototype/を試してみましたが、スクロールさせようとすると、テキストボックスなどがセルに存在する場合にヘッダとデータ部分にずれが生じてしまいます。 何かよい方法、紹介サイトなどありましたら、教えていただきたいと思います。よろしくお願いします。

    • ベストアンサー
    • HTML
  • 一覧画面のカラムヘッダクリックによるソートのかけ方の基本は?

    不動産サイトの、賃貸アパート検索結果リストなどで カラムヘッダにハイパーリンクを仕込み、それをキーにソートできますよね。 例:http://house.goo.ne.jp/rent/shuto_ap/area_tokyo23/13102.html 例えば、カラムヘッダの「家賃」をクリックすると安い順に並べたりできますが、 PHPで、スマートに実装するにはどうしたらいいか、考え方をうかがいたいです。 「家賃」のカラムヘッダに、 <a href="sample.php?sort=yachin&sort=desc">家賃</a> などとGETのリンクを埋め、 $sql = "select * from mytable order by " . $_GET["sort"] . " " . $_GET["sort"]; とするのが王道でしょうか?? 押すたびに ASC とDESCをひっくり返すアイデアがないのですが・・・ 隔離された管理者画面(一般ユーザーには非公開)だけでの操作なので、 セキュリティ等にはさほどこだわりありません。

    • ベストアンサー
    • PHP
  • csvファイルの読込みとソート

    いつも大変参考にさせていただいております。 csvファイルの読み込みとソートをしたく、ネットや過去ログ等を相当調べたのですが、完全に詰まってしまいました。 (検索キーワード:「php csv ソート」「php 二次元配列 ソート」など) とても困っています。どなたかよろしくお願いします。 以下のようなcsvファイルを読み込みソートしたいのです。 ■csvファイル 20110803, A, りんご 20111215, B, みかん 20110306, A, みかん 20110620, A, りんご 20110215, B, りんご ■個別にやりたい処理 (1)、左列の日付で昇順ソートしてすべて表示 (2)、「A」を含む行をすべて表示(日付順) (3)、「A」+「りんご」を含む行をすべて表示(日付順) □補足 csvをfgetcsvで読み込み、テーブルに入れて表示するところまではできました。 csvの行は増えていきます(max100行位)。列は固定。

    • ベストアンサー
    • PHP
  • エクセルでソートをかけたときの印刷がうまくいかない。

    エクセルで大きな表があり、オートフィルタで必要な部分のみが表示されるようにしたときに印刷ボタンを押すと、紙全面に表が表示されず、途切れ途切れになってしまいます。 どうも、オートフィルタ(ソート)をかける前に1ページ目にあった部分は1ページ目に、3ページ目にあった部分は3ページ目に印刷されてしまうようです。 ソートをかけた時の画面そのままに印刷するにはどうすればよいのでしょうか? よろしくお願いいたします。