• ベストアンサー

期間限定の抽出 SQL 文を教えてください。

MySQL を phpMyAdmin にて使用しています。 次のような項目があります。 bunrui varchar(5) kaisaibi date ここから下記の条件にてデータを抽出したいのですが、うまくいきません。条件を満たす SQL 文の書き方を教えてください。 条件1 kaisaibi が 2003年5月1日から2003年5月31日までの間で 条件2 bunrui が 04-01 または 06-01 であるもの。 SELECT * FROM `check_hiben` WHERE kaisaibi >= '20030501' AND kaisaibi <= '20030531' AND bunrui = '04-01' OR bunrui = '06-01' ORDER BY kaisaibi LIMIT 0 , 1000 上記の SQL 文を実行したところ、2003年5月以外のデータまで抽出されてしまいました。困っております。どなたかお助けください。よろしくお願いします。

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

  • ベストアンサー
  • osumitan
  • ベストアンサー率33% (102/307)
回答No.2

ORよりANDの方が優先度が高いせいです。 以下のようにおいたとして、  A=「kaisaibi >= '20030501'」  B=「kaisaibi <= '20030531'」  C=「bunrui = '04-01'」  D=「bunrui = '06-01'」 bontodesuさんの示された以下のSQLですと、  WHERE kaisaibi >= '20030501' AND kaisaibi <= '20030531'  AND bunrui = '04-01' OR bunrui = '06-01' 「AかつBかつC、またはD」 という結果になってしまうので、 bunrui = '06-01'ならkaisaibiによらずヒットしてしまいます。 実際にやりたいのは「AかつB、かつ、CまたはD」なので、 カッコをつけて優先順位を調整すればOKです。  WHERE ( kaisaibi >= '20030501' AND kaisaibi <= '20030531' )  AND ( bunrui = '04-01' OR bunrui = '06-01' ) kaisaibiの方のカッコはあってもなくても同じですが、 直感的にわかりやすくなるのでつけました。

bontodesu
質問者

お礼

ORよりANDの方が優先度が高いせいだったのですね。こういう場合は数学の計算式と同じようにカッコをつけてあげればよいわけですね。とても勉強になりました。 昨日の夜からずうっと悩んでいたのでとても助かりました。ありがとうございます。

その他の回答 (1)

回答No.1

えっと、自信ありませんw ご質問の構文でWHERE句に括弧を つけてみたらどうなりますか? ご質問の構文だと優先度(?)が全て 同一(?)の為条件1と条件2の区別が ないように見えます。 ーーこんな感じでしょうかーー SELECT * FROM `check_hiben` WHERE (kaisaibi >= '20030501' AND kaisaibi <= '20030531') AND (bunrui = '04-01' OR bunrui = '06-01') ORDER BY kaisaibi LIMIT 0 , 1000

bontodesu
質問者

お礼

happyrein さんの教えてくださったように書いて実行してみたらうまくいきました。 昨日の夜からずうっと悩んでいたのでとても助かりました。ありがとうございます。

関連するQ&A