• ベストアンサー

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

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

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

  • ベストアンサー
  • 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