- ベストアンサー
WHERE句かHAVING句の書き方
こんにちは id|時間 A|19:00 A|09:00 B|16:00 C|18:00 のようなデータがあって、現在時刻が20:00とします idでグループ化したデータの時間の最大値が、現在時刻の3時間前 (今回は17:00)よりも前または等しいIDだけ抽出するためには どういう条件式を書けば良いか、ヒントを頂けますでしょうか 今回の例でいうと、結果には B|16:00 のみ出てくるということです WHEREやHAVINGを使って試行錯誤してはみたのですが、どうしても 例でいうところの A|09:00とB|16:00 が出てきてしまう始末です (条件にあう方のデータをとってしまい、除外にならない) IF文をうまいこと混ぜればいけるんでしょうか… コードは頑張って自分で作るので、考え方のヒントやこういうのを 使ってみるといいよ、といったアドバイスを頂けると助かります うまく質問の意図が伝わっているか不安ですが、ヨロシクお願いします mysql クライアントのバージョンは5.0.45です
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
じゃぁ、havingで。 select id,max(time) from table group by id having max(time)<='17:00'
その他の回答 (3)
- qbr2
- ベストアンサー率50% (62/123)
>BETWEENよりは、大小比較でやっちゃった方がシンプルですかね? >(ちなみにその時のコードでは動きませんでした) 動かなかった理由はわかりませんが、 「範囲の指定」であるなら、BETWEENを用いる方が良いです。 一般的なRDBSであれば、比較を2回書くよりも速度が向上しますし、 可読性(これは好みの問題ですが・・・)も上がります。 ただし、BETWEENは境界値を含むので、 境界値を含めずに範囲を指定したいのであれば、 2回の比較を書くことになるかと思います。
お礼
レスありがとうございます 境界値を~という部分は、以上・以下の指定が出来ないというコトですよね 使いどころによって使い分けを行う必要があると理解しました 動かなかったコードは書き方が悪かったんだと思うので、また試してみて BETWEENが使えたら、そっちで対応しようと思います 重ねての回答、ありがとうございました
- nda23
- ベストアンサー率54% (777/1415)
回答は出ているようですが、補足します。 WHERE:静的に判別可能な条件を指定します。 例えば、「時間がNULLのものを除く」はレコード単体で分かる条件です。 HAVING:集計(グループ化)した結果を条件にします。 例えば、「最大値が17:00以前」とはグループにより、最大値が求まる まで、条件が分かりませんからWHEREでは指定できません。 一つのSQLでWHEREとHAVINGは両方指定できます。 (1)WHEREで条件によりレコードを制限する。 (2)上記で抽出されたレコードでグループ化する。 (3)HAVINGでグループ化により集計された結果を抽出条件にする。 以上です。
お礼
補足説明、ありがとうございます!コレ、私が知りたかったことです SQL文内で、どういう順番で処理されていくのかが まだわかってないんです だから、単純なSQL文は書けても複雑なものになるとお手上げで… こういう書き方をしている指南サイトがなかなか無い(言い回しが難しくて 頭に入らない)ので、わかりやすかったです 基本はこういうものと理解して、複雑な条件になっても惑わされないように しっかり覚えます
- yamada404
- ベストアンサー率56% (9/16)
こんな感じでどうですか。 select * from table t1 where concat( t1.id , t1.time ) in ( select concat( t2.id , max(t2.time)) from table t2 group by t2.id ) and t1.time <= '17:00'
お礼
レスありがとうございます! 明日 早速試してみますね!! 自分でもどうにか…と思ってIF使って書いてみたんですが 結局 偽も値とってきちゃうからダメだなーって諦めてたので とっても助かります 結果が出てから閉めさせて頂きますね
補足
試してみようと改めてコードを見返しての疑問なのですが table t1 って 何だろう…どこから来たんだろう…とわからなくて 試すことが出来ませんでした せっかく書いて頂いたのに申し訳ないです。。。 今回は#2 qbr2様のHAVINGでの書き方が直感的で、動作確認も出来たので qbr2様の方法でいってみるつもりなのですが、yamada404様のコードも 後学のために理解しておきたいと思っているので、もし宜しければですが 解説を頂けると大変嬉しいです yamada404様は どこでどういう風にSQLを勉強されましたか? 私はいまいち いい勉強方法を見つけられなくて、最終的には善意の皆様に 助けて貰ってばかりなので、すぐはムリでもこういうコードをホイホイと 書けるようになれたら…と常々思っているのです 書籍は一冊くらい手元にあるべきでしょうか。。。
お礼
回答ありがとうございます! 自分の環境に書き直して、動作OKでした 私がHAVINGで試した時には、BETWEENを使ってみたのですが BETWEENよりは、大小比較でやっちゃった方がシンプルですかね? (ちなみにその時のコードでは動きませんでした) 直感的な書き方で動作の理解がしやすかったので qbr2様のコードを採用させて頂くことにしました 追加質問をしてみたので、しばらく待ってから質問締めさせて頂きますね