• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL文がわかんないっす…)

SQL文がわかんないっす… レコードを抽出するためのSQL文を教えてください

このQ&Aのポイント
  • テーブルのgoodsID, stockNum, reservNum, dateから特定の条件を満たすレコードを抽出するためのSQL文を教えてください。
  • 特定の日付範囲内で、stockNum - reservNumが両方とも2以上のgoodsIDを取得するためのSQL文を教えてください。
  • もし指定した条件でレコードが存在しない場合、取得結果を空にしたいです。

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

  • ベストアンサー
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.3

SELECT goodsID FROM goods WHERE date IN ('2008-11-4','2008-11-5') GROUP BY goodsID HAVING SUM(CASE WHEN stockNum - reservNum >= 2 THEN 1 ELSE 0 END) = 2; こんな感じですかね。 GROUP化して、HAVINGで条件を充たした日数を数えてます。 INの後の日付のリストを変えたり、BETWEENを使ったり、 HAVINGのSUMの中を変えると、いろいろな条件で使えます。

dalianse
質問者

お礼

すいません、私の大勘違いでした。正常に動いていました。 ものすごく感謝! ありがとうございます。

dalianse
質問者

補足

ご回答ありがとうございます。 試してみましたがどうも期待している動きと違います。 いろいろ試しまして、下記SQLがほぼ期待通りに動いてくれました。 SELECT goodsID FROM goods WHERE (stockNum - reservNum) >= 2 AND date = '2008-11-4' AND EXISTS (SELECT goodsID FROM goods WHERE (stockNum - reservNum) >= 2 AND date = '2008-11-5') が、例えば2008-11-5のレコードが存在しない場合は、stockNum - reservNum = 0と同じ扱いで、セレクトしないでほしいのですが、セレクトしてきてしまいます。 そこのとこを解決できる方法はないでしょうか??

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>2008-11-4と2008-11-5のレコード、という指定 where `date` IN ('2008-11-4','2008-11-5') でいけますね、もちろん where `date`='2008-11-4' OR `date`='2008-11-5' でも結構です。 >4日と5日の両方ともが3以上 これはちょっとSQLらしくない仕様ですね。 MySQLのバージョンによってやり方がことなりますので 提示が必要です

dalianse
質問者

補足

単純にORとかINを使うと、片方のレコードだけヒットしてしまいます。 ちなみにバージョンは5.0.41です。 よろしくお願いします。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

普通に考えれば以下ですが、 where stockNum - reservNum >=2 >3以上と指定した場合は取得結果を空 の仕様がわかりかねます。 3以上なら、当然3番目のデータがヒットしますが なぜ3番目のデータではいけないのか書かないと回答しようが ありません。

dalianse
質問者

補足

すいません、レコードの中には他の日付、例えば2008-11-10などもありまして、その中で 2008-11-4と2008-11-5のレコード、という指定はどうやりますか? なぜ3番目のデータがいけないかは、4日と5日の両方ともが3以上でなければ必要ないからです。

関連するQ&A