• ベストアンサー

期間限定の抽出 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月以外のデータまで抽出されてしまいました。困っております。どなたかお助けください。よろしくお願いします。

  • MySQL
  • 回答数2
  • ありがとう数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

  • 同じSQL文で速度がだいぶ違う

    10万件程度レコードをもつ2つのテーブルに対し、下記のようなSQL文を実行します。 (実際のSQL文とは違いますが、だいたいこんな感じです。) SELECT * FROM aaa JOIN bbb USING(key) WHERE ORDER BY ccc LIMIT 50 OFFSET 5000 すると、 CGIから実行→CPU使用率が一時的に60%を超える。1~2秒待たされる。 phpMyAdminから同じSQL文を実行→CPUほどんど消費せず。瞬時に終わる。 のようにCGIからとphpMyAdminからで速度に大きな違いがあります。 こんなに差が付いてしまう理由がわかりましたら教えていただきたく。

    • ベストアンサー
    • MySQL
  • SQLエラー

    検索システムの検索結果の分割をしようとしています。 しかしどうしてもSQL文にエラーがでてしまいます。 SELECT * FROM shops where (area='◯◯◯') ORDER BY id DESC limit0, 10 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'limit0, 10' at line 1 該当するSQL文は以下になります。 $query = "SELECT * FROM shops"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where) . ' ORDER BY id DESC '; }   $query .= "limit" . $page_num*10 . ", 10" ; limit句の使い方等間違いはないのかなと思うのですが、いかがでしょうか? アドバイスご教示いただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpMyadmin利用してCSV抽出のSQL文

    さくらのレンタルサーバを利用しています そのサーバにあるphpMyadminの利用での質問です phpMyadminの検索機能を利用して特定のレコードをcsvデータとして抽出したいと思います 例えば、テーブルaのid=1000の場合の画面表示は次のSQL文で表示されます ------------------- SELECT * FROM `tbl_a` WHERE `id` =1000 ------------------- パソコン側の保存先が C:\Documents and Settings\users\My Documents\SAKURA_DL" とした場合のSQL文はどのように記載すればいいか教えていただけませんか ちなみに 次のように記載してみたのですがエクスポートされません --------------------------------------------- SELECT * FROM `tbl_a` WHERE `id` =1000 INTO OUTFILE "C:\Documents and Settings\users\My Documents\SAKURA_DL" ---------------------------------------------- よろしくお願いします。

  • SQL Server 2005 日付期間について(SQL文)

    恐れ入ります。 現在、SQL Serever 2005を利用し、VS 2005にて某システムを作成しています。 その中で、ある条件のデータをテーブルから削除する機能を作らなければならないのですが、以下がやりたい旨です。 [テーブル] SYSTEMTBL [定  義] systemYMD (varchar(8) ): 登録日付(例.20080725) systemHMS (varchar(6) ): 登録時間(例.103050) AAAAA (varchar(10)): カラム1 BBBBB (varchar(10)): カラム2 とあり、 SQL文を次のようにしたいです。 DELETE FROM SYSTEMTBL WHERE 登録日付 < 本日日付 - 日数 条件部分をどのようにすれば、 正しい日付の計算をしてくれるのでしょうか? 宜しくお願い申し上げます。

  • SQLの結果が返ってこない

    PHP+mysqlで以下のようなSQL文で処理を行ったのですがデータが返ってきません。 $sql = 'SELECT * FROM books WHERE id=3'; $recordSet = mysql_query($sql); if(mysql_fetch_assoc($recordSet)){ while ($table = mysql_fetch_assoc($recordSet)) {        処理     } } mysqlの画面で SELECT * FROM books WHERE id=3 を入力してみるとしっかりと結果が返ってきます。 ちなみに1行目を、違うテーブルの $sql = 'SELECT * FROM podcast WHERE code=3 ORDER BY dcdate DESC LIMIT 0,3'; にしてみると、データが表示されます。 2日間かけてずっと試行錯誤してみたのですが、完全に行き詰ってしまったので、何か考えられる原因はありませんでしょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • sql文の書き方

    いつもこちらで勉強させていただきます。 環境:mysql5.0 PHP5.1.4 apache 2.0.58 いま画面からパラメータ5受け取りました。 これをもってsql文を書こうとするが必須入力項目ではないため一つずつ判断して書いたら30種類の可能性がでてきてすごく長くなってしまいましたがなんか短縮させるいい方法はありませんか?またこれをファンクションで作り直そうとしたらちょっとうまくいかないのでどなたか教えてもらえませんか?ファンクションで渡すパラメータ($sql?$query?あるいは各パラメータですか? )は何にすればいいか?取得したい検索結果は配列です。ファンクション戻り値を連想配列にすることは可能ですか?ちょっと困っています。 $sql = "SELECT * FROM file_tbl WHERE"; // A だけの場合 if ( $b == "" and $c == "" and $d=="" and $e==""){ $sql = $sql." a='%s' order by b DESC,a"; $query = sprintf("$sql", mysql_real_escape_string($a)); // B だけの場合 }else if( $a == "" and $c == "" and $d=="" and $e==""){ $sql = $sql." b >='%s' order by b DESC,a"; $query = sprintf("$sql", mysql_real_escape_string($b)); // Cだけの場合 }else if( $a == "" and $b == "" and $d=="" and $e==""){ $sql = $sql." c <='%s' order by b DESC,a"; . . . // SQL クエリを実行する $result = mysql_query($query); よろしくご教授願います。

    • ベストアンサー
    • MySQL
  • SQL whereの中のif文について

    SQLの中にif文を使いたいですが、 うまくいきません。 やはりwhereの中で使えないですか? アドバイスお願いします。 実際のSQL文: $sql = "select * from room";     $sql = $sql . " WHERE ((Keisai = 1)"; if(Chinryou1>0){ $sql = $sql . " and (Chinryou1 <= {$rent1})";     }else if(Chinryou1==0){ $sql = $sql . " and (Chinryou2 <= {$rent1})";    } $sql = $sql . ")"; $sql = $sql . " order by Narabijun desc, Name"; $sql = $sql . ";"; $result = mysql_query($sql, $conn); $num = mysql_num_rows($result);

    • ベストアンサー
    • MySQL
  • sql文について

    sql文のswichをif分で変更したい。 下記のswitch文のlimitの範囲をユーザーが<a href="sqlpage1.php?sex=男&p=2">2ページ目</a>,<a href="sqlpage1.php?sex=男&p=3">3ページ目</a>,<a href="sqlpage1.php?sex=男&p=4">4ページ目</a>・・・・・・などを選択しクリックした場合にlimitの範囲を変更したいのですが(例 1ページ目・0~10、2ページ目・11~20、3ページ目・21~30、4ページ目・31~40・・・・・・) if文はどう書けばいいですか? ページはcssが一緒なので変えなくていいかなと思い一緒にしました。 以下、デフォルト(sqlpage1.php?sex=男&p=1)のものです。 switch($_REQUEST['sex']) { case 男; $sql = 'SELECT * FROM human where sex="男" order by limit (0,10)';ここを変更したい。 break; case 女; $sql = 'SELECT * FROM human where sex="女" order by limit 0,10'; break; case 中性; $sql = 'SELECT * FROM human where sex= "中性" order by limit 0,10'; break; }

    • ベストアンサー
    • MySQL
  • SQL文で

    T-SQLを使用しています。 下記のような場合どのようにSQL文を組めばよいのでしょうか?Group byを使用すると思うのですが・・・ テーブル名:SampleTbl フィールド1:ID(プライマリ) フィールド2:Name(varchar(4)) 【名前】 フィールド3:UpTime(varchar(16))【更新時刻】 ※UpTimeの概要 yyyyMMddhhmmssss 2004/06/01 12:00:0000 中身 1,鈴木,2004060112000000 2,鈴木,2004060112050000 3,鈴木,2004060112100000 4,鈴木,2004060112200000 5,山田,2004060112000000 抽出条件: 同一の名前で更新日が5分以内の範囲で更新されているデータのみ抽出する 抽出結果 1,鈴木,2004060112000000 2,鈴木,2004060112050000 3,鈴木,2004060112100000 上記の抽出結果を取得するにはどのようにすればよいか、ご教授お願い致します。

  • 単一SQL文にて抽出可能でしょうか?

    単一SQL文にて抽出可能でしょうか? Ver8.3系 予めサブクエリーにて任意の条件にて抽出した店データのIDの値を基に、 商品データを抽出するのですが、その商品は、お店毎にランダムに1件抽出される。 <抽出例> 例えば、サブクエリーにて5店舗対象となり、そのお店紐付けられる商品は お店毎にランダムに1商品しか抽出されない。 店ID、商品ID 000001、100001 000002、305001 010000、200010 011111、300001 020000、150000 色々試しているのですが、うまくいきません。 お詳しい方、ご教授願えないでしょうか? よろしくお願いします。