プロが教える店舗&オフィスのセキュリティ対策術

MySQLを使っています。

同じ商品のレコードが複数あります。

その多数のレコード中に、日付項目があります。そこから、
1)指定日に、2)一番近い過去の日の1件の、3)全商品のレコード、を抽出するには、

どのようなSQL文を書けばよいでしょうか?


1.過去に複数ある日付の中から、指定日に、一番近いレコード。


レコードの例)

指定日=2015-07-01

商品ID 日付
1 2015-10-11 ・・・未来 ⇒ 抽出せず
1 2015-08-02 ・・・未来 ⇒ 抽出せず
1 2015-07-01 ・・・指定日 ⇒ 抽出せず
1 2015-07-01 ・・・指定日 ⇒ 抽出せず
1 2014-01-01 ・・・過去 ⇒ 抽出せず
1 2015-06-03 ・・・過去 ⇒ 抽出したい★★
2 2015-10-11 ・・・未来 ⇒ 抽出せず
2 2015-08-02 ・・・未来 ⇒ 抽出せず
2 2015-07-01 ・・・指定日 ⇒ 抽出せず
2 2014-01-01 ・・・過去 ⇒ 抽出せず
2 2015-06-03 ・・・過去 ⇒ 抽出したい ★★

A 回答 (1件)

これってほぼ前回の応用では?



考慮しなくてはいけないのは、該当レコードが複数ある場合全て表示するのか、
それともどれか1つだけ抽出するのか、抽出する場合はどういったロジックをつかうのかです。
また過去データが1つもないものは表示しなくてよいのか、nullでも表示したいのかを
きめないといけません。

単純に合致するデータをすべて表示し、過去データがない場合は表示しないのであれば
こんな感じ

//データ
create table goods (id int not null primary key auto_increment,pid int,d date);
insert into goods(pid,d) values(1,'2015-10-11'),(1,'2015-08-02'),(1,'2015-07-01'),(1,'2015-07-01'),(1,'2014-01-01'),(1,'2015-06-03'),(2,'2015-10-11'),(2,'2015-08-02'),(2,'2015-07-01'),(2,'2015-07-01'),(2,'2014-01-01'),(2,'2015-06-03'),(3,'2014-01-01'),(3,'2014-01-02'),(3,'2014-01-02'),(4,'2015-07-10'),(4,'2015-07-11');

//抽出
select * from goods
where (pid,d) in (select pid,max(d)from goods where d < '2015-07-01' group by pid)

注意:pid=3は合致するレコードが2つあります
    • good
    • 0
この回答へのお礼

ありがとうございます。
前回のSQLを元に、試行錯誤したのですが、
結局、技術力不足で、実現できませんでした。

上記、回答いただいたので、完璧です。
全商品や、ある商品の過去データがなければ、
それは、抽出されなくてよいです。
=抽出結果が、0件でもよい。

PID3は、過去の最大日付が同じなので、
複数抽出されてもよいです。

色々考慮していただいて、大変申し訳ありません。
大変たすかります、ありがとうございます。

もっと、私が、条件を詳しく書かないといけなと
つくづく実感しました。

本当にありがとうございます。

今から、実際に、このSQLでやってみます。

お礼日時:2015/07/09 17:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す