2012-01-10 154 views
2

我有兩個表:MySQL查詢選擇

t1 
____________ 
projectID 
userID 
projectExpiration 

t2 
____________ 
usrID 
subscriptioID 
subscriptionExpiration 

我需要選擇從T1,項目ID,其中滿足以下條件:

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

用戶可以具有其他預訂在T2。我只需要他們在那裏擁有的「5」

我需要幫助把他們放在一起的ID單一訂閱條目的結果。

這裏是我到目前爲止有:

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) 

覺得我卡住了...

+0

你指的 「ONLY」,如果他們有ID = 5 ......的一個訂閱這是否意味着如果用戶有1個, 2,3和5你想跳過這個人?還是你的意思是你只希望那些誰和ID 5無論任何其他訂閱,他們還可以有......兩個不同的查詢......還有,如果他們訂閱了5,但一個已經過期,她們還有更多CURRENT訂閱#5 - 你想要嗎? – DRapp 2012-01-10 18:57:43

+0

是的,如果他們有其他訂閱,則跳過。 – santa 2012-01-10 19:00:11

+0

這裏的語法警察:正確的用法是'than'。正如在「如果超過3個月以上,那麼它是過期的」 – dar7yl 2012-01-10 20:14:54

回答

1

你想要一個not exists檢查,以確保5是唯一的行:

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.subscriptioID而不是y.subscriptionexpiration嗎? – santa 2012-01-10 19:01:15

+0

@santa - 是。是從你的帖子盲目複製該部分:) – Eric 2012-01-10 19:03:02

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

我只注意到我把用戶ID放在t2。它實際上是usrID,而在t1中是userID。抱歉,是我的錯。我認爲你的代碼也會改變一點。 – santa 2012-01-10 19:28:52