あなたの「必」の書き順を教えてください

別の掲示板に質問したのですが、難易度が高いのかしばらく回答が得られなかったのでこちらに質問してみます。(別の掲示板の方は質問を取り消しました。)ちょっと急いでいるのでどんなものでも構いません。SQLに詳しい方、ご教示お願い致します。環境は、MySQL5.1.33(MacOSX版)を使用しています。

以下のようなデータベースがあります。マスター系となるユーザテーブルと、それを参照するトランザクション系の買い物テーブルです。このデータベースから、「※連続して買い物をしたユーザをSELECTしたい」のですがそのようなことは可能でしょうか?可能であるとすると、どのようなSQLを書けばよろしいでしょうか?

※「連続して」とは、日付をまたがって、という意味です。
例)2009/06/12、2009/06/13

(1)ユーザテーブル
mysql> desc user;
userid, int(11), primary key
username varchar(15)

(2)買い物テーブル
mysql> desc purchase;
purchaseid, int(11), primary key
userid int(11)
purchaseid date

今、買い物テーブルに以下のようにデータがある場合
mysql> select * from purchase;
1, 3, 2004-01-02
6, 1, 2004-04-03
5, 2, 2008-04-05
4, 2, 2000-01-19
3, 5, 2004-01-01
2, 1, 2001-11-10
9, 5, 2003-12-31
8, 1, 2007-04-05
7, 3, 2004-01-03

mysql> select userid from ...
とすると3, 5を抜き出すようにしたいです。(3は2004/01/02, 2004/01/03だから。5は2003/12/31, 2004/01/01だから。)

このselect文の書き方を教えて頂きたいです。お手数をおかけしますがよろしくおねがいします。

A 回答 (3件)

これでもいけるかな。


select userid,username
from user
where userid
in
(SELECT p1.userid
FROM purchase as p1
where exists
( select 1 from purchase as p2
where p1.purchasedate + 1 = p2.purchasedate ))
    • good
    • 0
この回答へのお礼

出来ました!EXISTSは初めて知りました。ご回答ありがとうございました。

お礼日時:2009/06/12 13:23

mysqlは試すことができません。

MS-Accessだと下記SQLで3、5が抽出されます。
SELECT user.username
FROM (purchase INNER JOIN [user] ON purchase.userid = user.userid) INNER JOIN purchase AS purchase_1 ON purchase.userid = purchase_1.userid
WHERE (((purchase_1.purchasedate)=[purchase].[purchasedate]+1));

この回答への補足

ありがとうございます!今手元にパソコンがないのですが帰ったらすぐに試してみます。

補足日時:2009/06/12 06:53
    • good
    • 0
この回答へのお礼

出来ました。ご回答有り難うございました。

お礼日時:2009/06/12 13:23

やり方のみです。

私はSQL自体は詳しくないためselect文を作るのは面倒なので自分でお願いします。

purchase.date+1とpurchage.dateで自分自身とリレーション
(date+1側のテーブルをp1、date側をp2とする)
where p1.userid = p2.userid
こんな感で出来ると思います。

もし分からなければSQL文を書ける人に↑を頼むか、回答の続きを促してください。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2009/06/12 13:24

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

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


おすすめ情報