アプリ版:「スタンプのみでお礼する」機能のリリースについて

商品テーブルの中で、
同じ商品のレコードが複数あります。

その多数のレコード中に、日付項目があります。

そこから、
1)指定日に、2)一番近い過去の日の1件、3)指定日を含めて、複数ある指定日及び未来の全レコード、を抽出するには、

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


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


レコードの例)

指定日=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 2015-07-01 ・・・指定日 ⇒ 抽出したい
2 2014-01-01 ・・・過去 ⇒ 抽出しない★
2 2015-06-03 ・・・過去 ⇒ 抽出したい

A 回答 (1件)

実は単純そうでちょっとめんどうな命題です。



例示のものだけであればこんな感じ
//元データ
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');

//集計1
select g1.* from goods as g1 inner join(
select pid,max(d) as d from goods where d < '2015-07-01' group by pid) as g2
on g1.pid=g2.pid and g1.d>=g2.d

ところが・・・
データの中に、「指定日より後に(前に)しかデータがない」場合など想定するとちょっと変わってきます。

//データ追加
insert into goods(pid,d) values(3,'2014-01-01'),(3,'2014-01-02'),(4,'2015-07-10'),(4,'2015-07-11');

おなじ集計をかけるとpid=4のデータが抽出されません。
これはサブクエリ
select pid,max(d) as d from goods where d < '2015-07-01' group by pid
が指定日より過去のデータを持っているpidしか対象としないからです。

これをふまえて以下のようにするとpid=4もひろえます。
//集計2
select g1.* from goods as g1 left join(
select pid,max(d) as d from goods where d < @d:='2015-07-01' group by pid) as g2
on g1.pid=g2.pid and g1.d>=g2.d
where g2.d is not null or g1.d>=@d
    • good
    • 0
この回答へのお礼

ご回答及び、派生した考慮、ありがとうございます。
確かにおっしゃるとおりのことの可能性もあります。
今から、実際にプログラムに組み込んでテストしてみます。
お手数をおかけしました。

お礼日時:2015/07/09 11:20

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

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