PHP+mySQLで、DBからある順序で情報を取り出す方法(SELECT ORDER BY)で困っています。


●テーブル情報
create table sample (
no int NOT NULL auto_increment,
data varchar(16),
time timestamp NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (no)
);

●動作結果
INSERT INTO sample (data) VALUE ("***")

no data time
------------------------------
1 "test1" 2012-05-02 17:26:03
2 "test2" 2012-05-02 17:26:03
3 "test3" 2012-05-02 17:28:26
4 "test4" 2012-05-03 13:30:42

●質問事項
上記DBからdataを以下の順序で取り出したいのですが、よい方法が思いつきません。

条件1) 時刻(time)の新しい順
条件2) 時刻(time)が同じであれば、noの小さい順

「動作結果」の場合、下の順序で取り出しできることが期待値です。

no data time
------------------------------
4 "test4" 2012-05-03 13:30:42
1 "test1" 2012-05-02 17:26:03
2 "test2" 2012-05-02 17:26:03
3 "test3" 2012-05-02 17:28:26

これをmySQLの文法だけでなんとかできないかというのが質問です。
たとえば以下の方法だと、期待値となりません。

SELECT data FROM sample ORDER BY time DESC, no

no data time
------------------------------
4 "test4" 2012-05-03 13:30:42
1 "test1" 2012-05-02 17:26:03
2 "test2" 2012-05-02 17:26:03
3 "test3" 2012-05-02 17:28:26

よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/05/03 15:38:31
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント100pt

質問の文面だと、「期待値」と「期待通りになりません」が同じ並びになってますが、
4 → 3 → 1 → 2 の順で取りだしたい、ということですよね。

http://sqlfiddle.com/#!2/aa68b/1
↑は、SQL Fiddle というサイトで試した結果です。
選択列を data から * に変えただけですが、期待通りの結果になってるように思えます。

id:cochoo

ご回答ありがとうございます。
> 「期待値」と「期待通りになりません」が同じ並びになってますが、
「期待とおりになりません」の例が誤記です。大変申し訳ありません。

> 4 → 3 → 1 → 2 の順で取りだしたい、ということですよね。
取り出したい順序は、4→1→2→3です。

いろいろご丁寧に対応いただいて恐縮ですが、再度のご教授をお願いいたします。

2012/05/03 15:04:19
id:cochoo

自己解決しましたので、これで質問を終了させていただきます。
みなさま、ありがとうございました。

2012/05/03 15:38:20

その他の回答1件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント100pt

質問の文面だと、「期待値」と「期待通りになりません」が同じ並びになってますが、
4 → 3 → 1 → 2 の順で取りだしたい、ということですよね。

http://sqlfiddle.com/#!2/aa68b/1
↑は、SQL Fiddle というサイトで試した結果です。
選択列を data から * に変えただけですが、期待通りの結果になってるように思えます。

id:cochoo

ご回答ありがとうございます。
> 「期待値」と「期待通りになりません」が同じ並びになってますが、
「期待とおりになりません」の例が誤記です。大変申し訳ありません。

> 4 → 3 → 1 → 2 の順で取りだしたい、ということですよね。
取り出したい順序は、4→1→2→3です。

いろいろご丁寧に対応いただいて恐縮ですが、再度のご教授をお願いいたします。

2012/05/03 15:04:19
id:cochoo

自己解決しましたので、これで質問を終了させていただきます。
みなさま、ありがとうございました。

2012/05/03 15:38:20
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント100pt

time って 年月も含んでませんか?

2012-05-03 13:30:42

これ自体が timeなら 期待値どおりには ならないですね。

他1件のコメントを見る
id:cochoo

ご回答ありがとうございます。
No.1さんのご指摘通り、「期待とおりになりません」の例が私の誤記です。大変申し訳ありません。
取り出したい順序は、4→1→2→3です。
timeの型がtimestampなのですが、これではORDERBYできないということでしょうか?ちょっと調べてみます。ありがとうございました。

2012/05/03 15:05:05
id:taknt

timestamp で 日付も含まれてる?

2012/05/03 15:11:24
  • id:tenori_lion
    tenori_lion 2012/08/11 09:56:16
    自己解決しているみたいなのでいまさらな感じですが、
    TIMESTAMP 型が「秒」より下の単位まで持っているんじゃないかなと思います。
    だから時刻が表示上「同じ」ように見えても同じと判定されてないだけじゃないかなと推測。

    MySQL の関数知らないし試す環境がないので推測ばかりですが、
    この場合だと秒単位に切り詰めて ORDER BY すれば良いんじゃないかと。

    order by to_char(TIME, 'yyyymmddhhmmss') desc, NO

    みたいな感じで。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません