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文で実現したいと思い、
質問させていただきました。
ご教授いただければ幸いです。
何卒よろしくお願い致します。
お礼
できました! 教えてもらったのですが、 ORDER BY day + 0 ASC でOKみたいです。 castの方法は結局分からないのですが、 charからintへの変換はでき、期待通りの出力が得られました。 intを文字列に直すとき + ""をするとできる(正規な方法ではないかもしれないですが) のと同じですね。 order by 句でも使えるのは勉強になりました。 >それに、日付をchar(2)に格納するメリットを、あまり思いつかないのですが? そうですよね。 tinyintとかにしてくれと頼んだほうがいいでしょうか・・ 幸い、このテーブルは自分しか使わないのですが、 他の、日付を使う画面ではやはりchar型になっているのだと思います。 本質的な方法ではないかもしれませんが、java側で対処することにします。 ご回答ありがとうございました。
補足
ご回答ありがとうございます。 MySQLを使っています。 確かにnumber型はないですね・・ tinyintかintにします。 http://dev.mysql.com/doc/refman/4.1/ja/cast-functions.html のリファレンスを参考にしながら書いたのですが、どうもキャストが使えないようなのです。 sql文:SELECT year, month, day FROM Calendar WHERE year = ? month = ? ORDER BY cast ( day as signed ) ASC エラー文:Incorrect parameters in the call to stored function 'cast' com.mysql.jdbc.SQLError:createSQLException(936) com.mysql.jdbc.MysqlIO:checkErrorPacket(2985) com.mysql.jdbc.MysqlIO:sendCommand(1631) com.mysql.jdbc.MysqlIO:sqlQueryDirect(1723) com.mysql.jdbc.Connection:execSQL(3256) com.mysql.jdbc.PreparedStatement:executeInternal(1313) com.mysql.jdbc.PreparedStatement:executeQuery(1448) MySQLのバージョンはMySQL5.xですので、cast()は使えるはずなのですが・・・ (?にはsetString()してあります)