2012-01-10 17 views
2

を選択:MySQLのクエリは、私は2つのテーブル持っ

t1 
____________ 
projectID 
userID 
projectExpiration 

t2 
____________ 
usrID 
subscriptioID 
subscriptionExpiration 

をIは、以下の条件が満たされたT1からporject IDを選択する必要があります

t1.projectExpiration = older then 3 months 
t2.subscriptioID = '5' 
t2.expiration = older then 3 months 

ユーザがT2で他のサブスクリプションを有していてもよいです。 IDが '5'の単一のサブスクリプションエントリがある場合のみ結果が必要です

私はそれをまとめてお手伝いが必要です。ここで

は、私がこれまで持っているものです:私はこだわっているよう

SELECT projectID 
FROM t1 
LEFT JOIN t2 ON (t1.userID = t2.userID) 
WHERE t1.projectExpiration < (CURDATE() - INTERVAL 3 MONTH) 
    AND t2.subscriptionExpiration = 5 
     AND t2.subscriptionExpiration < (CURDATE() - INTERVAL 3 MONTH) 

あなたは5が唯一の行であることを確認するnot existsチェックをしたい...

+0

彼らはID = 5の単一のサブスクリプションを持っている場合は、 "ONLY" を参照してください...ユーザーが1を持っている場合、これはどういう意味、 2、3、5あなたはこの人をスキップしますか?あなたが持っている他のサブスクリプションとは関係なく2人の異なるサブスクリプションに関係なく、5人のIDと5のIDを持っている人だけが必要であることを意味しましたか?また、5人がサブスクライブしていて、 #5へのより多くのCURRENTサブスクリプション - あなたはそれをしたいですか? – DRapp

+0

はい、他のサブスクリプションがある場合はスキップしてください。 – santa

+0

ここに文法警察があります:正しい使用法は「より」です。 「3ヶ月以上経過している場合は期限切れです」 – dar7yl

答えて

1

を感じる:

select 
    * 
from 
    t1 x 
    inner join t2 y on 
     x.userid = y.userid 
where 
    x.projectexpiration < curdate() - interval 3 month 
    and y.subscriptionid = 5 
    and not exists (
     select 
      1 
     from 
      t2 z 
     where 
      z.userid = x.userid 
      and z.subscriptionid <> 5 
    ) 

left joinの代わりにinner joinを使用しました。これは、t2行が存在しない行(つまり、where節にnullsが含まれていない行)を取得したくないためです。だから、それは単に不必要なオーバーヘッドです。 inner joinは、あなたが望む結果セットを、はるかに明確にしてくれます。

+0

うわー、すばらしい! y.subscriptionexpirationの代わりにy.subscriptioIDを意味しましたか? – santa

+0

@ santa - はい。あなたの投稿から盲目的にその部分をコピーしていました:) – Eric

1
SELECT 
    sq1.projectID 
FROM 
    (SELECT * FROM T2 WHERE subscriptioID=5 
    AND subscriptionExpiration < DATE(now() - INTERVAL 3 MONTH)) sq2 
    INNER JOIN 
    (SELECT * FROM T1 WHERE projectExpiration < DATE(now() - INTERVAL 3 MONTH)) sq1 
    ON sq12.usrID=sq1=userID 
; 

または

SELECT 
    sq1.projectID 
FROM 
    (SELECT usrID userID,subscriptioID,subscriptionExpiration 
    FROM T2 WHERE subscriptioID=5 
    AND subscriptionExpiration < DATE(now() - INTERVAL 3 MONTH)) sq2 
    INNER JOIN 
    (SELECT * FROM T1 WHERE projectExpiration < DATE(now() - INTERVAL 3 MONTH)) sq1 
    USING (userID) 
; 

または

SELECT 
    sq1.projectID 
FROM 
    (SELECT * FROM T2 WHERE subscriptioID=5 
    AND subscriptionExpiration < DATE(now() - INTERVAL 3 MONTH)) sq2 
    INNER JOIN 
    (SELECT projectID,userID usrID,projectExpiration   
    FROM T1 WHERE projectExpiration < DATE(now() - INTERVAL 3 MONTH)) sq1 
    USING (usrID) 
; 
+0

私はちょうど私がt2にuserIDを入れていることに気付きました。実際にはusrIDであり、t1ではuserIDです。すみません、私の間違いです。私はコードも少し変わると思う。 – santa

関連する問題