2012-01-10 4 views
2

J'ai deux tables:requête MySQL sélectionnez

t1 
____________ 
projectID 
userID 
projectExpiration 

t2 
____________ 
usrID 
subscriptioID 
subscriptionExpiration 

Je dois sélectionner porject ID de T1 lorsque les conditions suivantes sont réunies:

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

L'utilisateur peut avoir d'autres abonnements en t2. J'ai seulement besoin des résultats où ils ont une seule entrée d'abonnement qui a un ID de '5'

J'ai besoin d'aide pour tout rassembler.

Voici ce que j'ai jusqu'à présent:

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) 

impression que je suis coincé ...

+0

Vous faites référence à "seulement" si elles ont un abonnement unique ID = 5 ... Est-ce que cela signifie que si l'utilisateur a 1, 2, 3 et 5 vous voulez passer cette personne ??? ou vouliez-vous dire que vous voulez seulement ceux qui ont et ID 5 indépendamment de tout autre abonnement qu'ils peuvent avoir aussi ... deux requêtes différentes ... Aussi, que se sont-ils abonné à 5, mais un était déjà expiré, et ils ont un autre plus d'abonnement actuel à # 5 - voulez-vous ça ??? – DRapp

+0

Oui, passez s'ils ont d'autres abonnements. – santa

+0

Police de grammaire ici: l'utilisation correcte est «que». Comme dans "Si il est plus vieux que 3 mois, alors il est expiré" – dar7yl

Répondre

1

Vous voulez un chèque not exists pour vous assurer 5 est la seule ligne:

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 
    ) 

Je devrais également mentionner que j'ai utilisé un inner join au lieu d'un left join ici. Cela est dû au fait que vous ne voulez pas récupérer des lignes où une ligne t2 n'existe pas (vous ne comptabilisez pas nulls dans votre clause where). Donc, c'est juste des frais généraux inutiles. Un inner join nous amène à l'ensemble de résultats que vous voulez d'une manière beaucoup plus claire.

+0

Wow, great! Voulez-vous dire y.subscriptioID au lieu de ysubscriptionexpiration? – santa

+0

@santa - Yup. A été copier cette partie aveuglément de votre poste :) – 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 
; 

ou

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) 
; 

ou

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

Je viens de remarquer que j'ai mis userID en t2. C'est en fait usrID, alors que userID en t1. Désolé, mon erreur. Je suppose que votre code va changer un peu aussi. – santa