2012-01-10 153 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