Page 1 sur 1

requête genre "NOT IN" dans Mysql...

Posté : 14 mars 2005, 01:01
par Moi
Bonjour,

je n'arrive pas à reproduire une requête en mysql ...
Je recherche tous les nouveaux clients ayant commandé entre une date1 et une date2.

Voici ma requête qui ne marche pas dans mysql :

SELECT COUNT(C1.id_client) AS nouveaux_client FROM commande AS C1 INNER JOIN commande AS C2 ON C1.id_client = C2.id_client WHERE C2.id_client IS NULL AND C2.date_cde < '".$date1."' AND C1.date_cde >= '".$date1."' AND C1.date_cde <= '".$date2."'

Quelqu'un pourrait m'aider ?

Merci !

Erreur de conception de SQL

Posté : 14 mars 2005, 10:53
par sadeq
Cette requête est mal construite.
En effet, si la source est la même (commande) et les jointures aussi
....FROM commande AS C1 INNER JOIN commande AS C2 ON C1.id_client = C2.id_client WHERE C2.id_client IS NULL ...
l'id_client est vollu nul quelle que soit sa source (c1 ou c2) du coup on n'a pas besoin de créer deux vues (qui sont les mêmes d'ailleurs) de la table commande => une source des deux suffit.
Simplification : la requête suivante suffit pour compter les nouveaux clients

Code : Tout sélectionner

SELECT COUNT(id_client) AS nouveaux_client FROM commande WHERE id_client IS NULL
A condition que "id_client" qui est une clé étrangère (venue de la table CLIENT) autorise les nuls et n'est pas lié par une relation d'intégrité référentielle dans la table COMMANDE.

Maintenant, la deuxième partie de la requête filtre les commandes par date :
....AND C2.date_cde < '".$date1."' AND C1.date_cde >= '".$date1."' AND C1.date_cde <= '".$date2."'
Selon, ce qui est avancé plus haut, cette condition peut être alors simplifiée par :

Code : Tout sélectionner

.... AND date_cde >= '".$date1."' AND date_cde <= '".$date2."'
Ce qui donne la requête finale :

Code : Tout sélectionner

SELECT COUNT(id_client) AS nouveaux_client FROM commande WHERE id_client IS NULL AND date_cde >= '".$date1."' AND date_cde <= '".$date2."'
Qui affiche le nombre de nouveaux clients ayant commandés entre deux dates données.

La même requête peut être écrite :

Code : Tout sélectionner

SELECT COUNT(id_client) AS nouveaux_client FROM commande WHERE id_client IS NULL AND date_cde BETWEEN '".$date1."' AND '".$date2."'

Posté : 14 mars 2005, 16:53
par Invité
Bonjour,

je te remercie pour ta réponse et d'avoir passé du temps. Mais en fait, ta requête ne correspond pas à ce que je veux faire :

Je veux tous les id_client (les id_client ne sont jamais nul, c'est une clé auto-increment) qui sont présents dant la période date1 à date2 (>= date1 et <=date2) et qui ne sont pas présents avant la période date1 (< date1). En gros, tous les nouveaux clients ayant acheté pendant la période date1 à date2.

Merci d'avance !

Moi

Posté : 14 mars 2005, 16:59
par sadeq
Tous les clients ayant achetés pendant la période date1 à date2.

SELECT id_client AS nouveaux_client
FROM commande
WHERE date_cde BETWEEN '".$date1."' AND '".$date2."'

Posté : 14 mars 2005, 17:00
par Invité
petit complément : voici la logique de ma requête à traduire en mysql :

SELECT COUNT(id_client) AS nouveaux_client FROM commande WHERE date_cde BETWEEN '".$date1."' AND '".$date2."' AND id_client NOT IN (SELECT id_client FROM commande WHERE date_cde < '".$date1."')

Merci !