2010-10-12 3 views
0

Après plusieurs heures de recherche, je cède finalement et demande de l'aide. J'ai trouvé quelque chose qui me rapproche, mais ne semble pas fonctionner correctement.MYSQL - Sélection des utilisateurs existants qui n'ont pas fait d'entrée dans les 3 derniers mois, mais qui ont fait une entrée dans les 6 derniers mois

Essentiellement à la recherche d'utilisateurs qui nous utilisent entre 3 mois et 6 mois, mais qui ne l'ont pas fait depuis 3 mois.

Par souci de l'exemple permet de dire que j'ai deux tables événement nommé (id, clientFK, insertion_date, officeFK) et client (id, nom):

SELECT DISTINCT e.id, e.insertion_date, c.name 
FROM event e 
LEFT JOIN client c ON c.id = e.clientFK 
WHERE e.id NOT IN ( 
SELECT e.id 
FROM event e 
WHERE e.insertion_date 
BETWEEN (
NOW() - INTERVAL 3 
MONTH 
) 
AND NOW() 
) 
AND e.insertion_date > (NOW() - INTERVAL 6 
MONTH) 
AND officeFK =1 
ORDER BY e.insertion_date DESC 

** Mise à jour ** * id est juste une colonne auto-incrémentée donc évidemment, elle ne s'afficherait jamais en utilisant la logique ci-dessus. Je voulais chercher le clientFK dans la table des événements. Sur la base de la première réponse ci-dessous je suis venu avec ceci:

SELECT DISTINCT e.clientFK, e.insertion_date, c.name 
FROM event e 
LEFT JOIN client c ON c.id = e.clientFK 
WHERE e.clientFK NOT IN (
    SELECT e.clientFK FROM event e 
    WHERE e.insertion_date > (NOW() - INTERVAL 3 DAY) 
) 
AND e.insertion_date BETWEEN (NOW() - INTERVAL 3 DAY) AND (NOW() - INTERVAL 6 MONTH) 
AND officeFK =1 
ORDER BY e.insertion_date DESC 

Cependant, même si la réduction de l'NOT IN à seulement 3 sous_requête jours, je suis toujours retourner 0 lignes. La modification de NOT IN à IN entraîne également 0 lignes retournées. Il y a des milliers de lignes dans ma table d'événements où le clientFK est "PAS DANS" les 3 derniers jours. Je dois faire quelque chose de mal quelque part.

CORRECT CODE CI-DESSOUS:

SELECT DISTINCT e.id, e.insertion_date, c.name 
FROM event e 
JOIN client c ON c.id = e.clientFK 
WHERE e.clientFK NOT IN (
    SELECT e.clientFK FROM event e 
    WHERE e.insertion_date > (NOW() - INTERVAL 3 MONTH) 
) 
AND e.insertion_date < (NOW() - INTERVAL 3 MONTH) 
AND insertion_date > (NOW() - INTERVAL 6 MONTH) 
AND e.officeFK = 1 
ORDER BY e.insertion_date DESC 

Répondre

1

Il y a plusieurs façons de le faire. Mais je pense que tu es proche. Vous ne semblez pas avoir la plage de dates correcte pour 3-6 mois dans votre requête principale. Vous étiez en train de vérifier quoi que ce soit de 6 mois jusqu'à maintenant. Cela ne correspond pas à la spécification de l'OP - utilisateurs d'un événement il y a 3-6 mois, mais pas au cours des 3 derniers mois. Logiquement, il semble que c'est la même chose, mais essayez ceci.

SELECT DISTINCT e.id, e.insertion_date, c.name 
FROM event e 
JOIN client c ON c.id = e.clientFK 
WHERE e.clientFK NOT IN (
    SELECT e.clientFK FROM event e 
    WHERE e.insertion_date > (NOW() - INTERVAL 3 MONTH) 
) 
AND e.insertion_date BETWEEN (NOW() - INTERVAL 3 MONTH) AND (NOW() - INTERVAL 6 MONTH) 
AND e.officeFK = 1 
ORDER BY e.insertion_date DESC 
+0

Vous avez raison sur ma plage de dates. J'ai corrigé cela, mais je retourne toujours 0 lignes. Voir la mise à jour que j'ai faite au message original ci-dessus. –

+0

Merci pour votre aide jusqu'à présent !!! –

+0

J'ai mis à jour mon code. Divisez la requête en plusieurs parties et vérifiez la sortie. C'est exécuter la sous-requête seulement et voir ce qu'il trouve. J'ai également abandonné le 'LEFT JOIN' juste pour' JOIN '. –

Questions connexes