SELECT文で抽出時に複数カラムのソート方法についてご質問します。
SELECT文で抽出時に複数カラムのソート方法についてご質問します。
開発環境は以下になります。
・PHP Version 5.2.11
・MySQL (5.0)
そこでやりたいことです。
レストランの開店時間が、バラバラに入力されるとして
以下のデータがDBに格納されています。
TABLE `reserve`
ID,NAME,DATE1,FLAG1,OPEN1,DATE2,FLAG2,OPEN2,DATE3,FLAG3,OPEN3
1,A店,2010-07-05,0,10:00,2010-07-06,1,12:00,2010-07-07,1,10:00
2,B店,2010-07-06,1,13:00,2010-07-07,1,13:00,2010-07-08,1,13:00
3,C店,2010-07-06,0,11:00,2010-07-07,0,11:00,2010-07-08,1,16:00
4,D店,2010-07-04,1,10:00,2010-07-05,0,10:00,2010-07-06,1,10:00
5,E店,2010-07-06,0,13:00,2010-07-07,1,11:00,2010-07-08,0,13:00
5,F店,2010-07-07,1,10:00,2010-07-08,0,10:00,2010-07-09,1,10:00
・
・
・
種別は
ID:主キー
NAME:VARCHAR
DATE1~3:DATE
FLAG1~3:INT
OPEN1~3:TIME
※FLAG1~3は、0=店休日、1=営業日です。
ここから毎日の開店状態を、早い開店から順番に表示したいのです。
7月7日の開店状態を表示する場合の結果は
2010年07月07日
A店:10:00開店
F店:10:00開店
E店:11:00開店
B店:13:00開店
・
・
・
このように、開店時間が早い順からソートして出力となります。
そこで以下のセレクト文で呼び出してみると抽出はうまくいきました。
SELECT * FROM `reserve`
WHERE `DATE1` = '2010-07-07' AND `FLAG1` =1
OR `DATE2` = '2010-07-07' AND `FLAG2` =1
OR `DATE3` = '2010-07-07' AND `FLAG3` =1
しかし、ソートがうまくいきません。
ORDER BY `TIME1` , `TIME2` , `TIME3` ASC
ORDER BY `TIME1` ASC , `TIME2` ASC , `TIME3` ASC
ORDER BY `TIME1` `TIME2` `TIME3` ASC
そこで、TIME1~TIME3をまとめてインデックスにしてみました。
でもうまくいかないです。
色々と試してみましたがうまくいきません。
根本的に間違えているのでしょうか?
データを取り出してから、PHPでソートをかける方が良いのでしょうか?
PHPでソートをするには、DBから取り出したデータを、連想配列に変換して
ソートしてとなると思いますが。
抽出したデータを表示後、さらに店名でソートして再表示したりという
ことを考えているので、出来ればSELECT文で実現したいと思い、
質問させていただきました。
ご教授いただければ幸いです。
何卒よろしくお願い致します。
お礼
有難うございます。多段の場合の処理方法、とても参考になりました。 実現したいのは多段ではないですが、覚えておきます。 名前、番号、など計5種類くらいをソートしたいです。 > o%5Bx%5D=d&o%5By%5D=a&o%5Bz%5D=d o[x]=d & o[y]=a & o[z]=d こういうことですか。 特殊な文字を使うメリットってなんですか? >SQLでは作成日が今日ならNEW、PHPでは作成日が更新日ならNEW >と書かれていませんか? 更新日にしていたところをdate("Y-m-d G:i:s")にしてみました。 前回は日単位でしたが、data()だと秒単位で計算されるのですね。 このやり方が一般的ですか? アドバイスを参考にさせていただき、改善1と2をやってみました。 改善1はjavascriptがオフだと機能しなくなってしまいます。 改善2はjavascriptがオフのときは<noscript>でsubmitボタンを出して機能しますが、radioボタンになってしまいます。 radioボタンを使うことなくaタグで囲ってjavascript未対応でも機能すればいいですが・・・ 改善1と2どちらを選びますか? ■■■改善1■■■ <input type="hidden" name="d" value="md" /> <input type="hidden" name="c" value="asc" /> javascript未対応の方には更新日時順をascで。 <?php $cer = "SELECT * FROM data_data WHERE 1"; /*-------- PHPの改善箇所 ---------*/ if(isset($_GET['dd'])&&isset($_GET['sc'])){ $a = array("modified_date"=>"md", "create_data"=>"cd"); if(in_array($_GET['dd'], $a)){ foreach($a as $key => $value){ if($_GET['dd'] != $value) continue; $_GET['dd'] = $key; } } $cer .= " ORDER BY ".$_GET['dd']." ".$_GET['sc']; } /*--------------------------------*/ $acc = mysql_connect(ホスト,ユーザー,パスワード); $que = mysql_query($cer,$acc); $html = ""; while($row = mysql_fetch_array($que)){ $id = $row["id"]; $name = $row["name"]; $modified_date = $row["modified_date"]; $create_data = $row["create_data"]; $daydiff = floor((strtotime(date("Y-m-d G:i:s"))-strtotime($create_data))/(3600*24)); if($daydiff==0){$datatext = 'new';}else{$datatext='';} $html .= "<tr><td>$id</td><td>$name</td><td>$modified_date</td><td>$create_data</td><td>$datatext</td></tr>\n"; } ?> <html lang="ja"> <head> <title></title> </head> <body> <form name="formname" method="GET" action="data-sort-jssubmit.php"> <input type="hidden" name="dd" value="md" /> <input type="hidden" name="sc" value="desc" /> </form> <script type="text/javascript"> function sortchange(d,c){ var frm = document.forms['formname']; frm.dd.value = d; frm.sc.value = c; frm.submit(); } </script> <p>更新日時順<br /> <a href="javascript:sortchange('md','desc');">新着順</a> <a href="javascript:sortchange('md','asc');">古着順</a> </p> <p>作成日時順<br /> <a href="javascript:sortchange('cd','desc');">新着順</a> <a href="javascript:sortchange('cd','asc');">古着順</a> </p> <table><?php echo $html; ?></table> </body> </html> ■■■改善2■■■ <?php $cer = "SELECT * FROM data_data WHERE 1"; /*-------- PHPの改善箇所 ---------*/ if(isset($_GET['order'])){ list($d, $order) = explode("_", $_GET['order']); $a = array("modified_date"=>"md", "create_data"=>"cd"); if(in_array($d, $a)){ foreach($a as $key => $value){ if($d != $value) continue; $data = $key; } } $cer .= " ORDER BY ".$data." ".$order; } /*--------------------------------*/ $acc = mysql_connect(ホスト,ユーザー,パスワード); ~この間は前回・改善1と同じです~ $html .= "<tr><td>$id</td><td>$name</td><td>$modified_date</td><td>$create_data</td><td>$datatext</td></tr>\n"; } ?> <html lang="ja"> <head> <title></title> </head> <body> <form method="GET" action="data-sort-nametouitsu.php"> <p>更新日時順<br /> <input type="radio" name="order" value="md_desc" onclick="sortchange(this.form)" <?php if(isset($_GET['order']) && $_GET['order']=='md_desc') {echo 'checked ';} ?>/>新着順 <input type="radio" name="order" value="md_asc" onclick="sortchange(this.form)" <?php if(isset($_GET['order']) && $_GET['order']=='md_asc') {echo 'checked ';} ?>/>古着順 </p> <p>作成日時順<br /> <input type="radio" name="order" value="cd_desc" onclick="sortchange(this.form)" <?php if(isset($_GET['order']) && $_GET['order']=='cd_desc') {echo 'checked ';} ?>/>新着順 <input type="radio" name="order" value="cd_asc" onclick="sortchange(this.form)" <?php if(isset($_GET['order']) && $_GET['order']=='cd_asc') {echo 'checked ';} ?>/>古着順 </p> <noscript> <input type="submit" name="order" value="送信" /> </noscript> </form> <script type="text/javascript"> function sortchange(frm){ frm.submit(); } </script> <table><?php echo $html; ?></table> </body> </html>