Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/08/2008, 16h37   #1
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
Par défaut Recherche des clients qui n'ont pas commandé depuis plus de 30 jours

Bonjour,

j'ai une requete à faire qui consiste à récupérer le numéro des clients qui n'ont pas passé commande depuis plus de 30 jours.

J'ai donc fait ceci..
Code :
1
2
3
4
5
6
7
8
9
 
 
SELECT DISTINCT(facture.numClient)
	FROM facture 
	WHERE (datediff(now(),dateFacture)>=30) 
	AND facture.numClient NOT IN (
					SELECT facture.numClient
					FROM facture
					WHERE datediff(now(),dateFacture) <30)
L'inconvénient c'est que c'est assez long comme requete , mais elle semble donner des résultats exacts.

A votre avis, ma requete est elle correcte ou y-a t-il plus simple ?

Merci beaucoup
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2008, 16h43   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 409
Points : 6 409
Bonjour,

Je ne vois pas, à part dégrader les performances, à quoi peut bien te servir la sous-requête .
La requête suivante ne suffit-elle pas :
Code :
1
2
3
SELECT DISTINCT(facture.numClient)
FROM facture 
WHERE datediff(now(),dateFacture) >= 30
ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2008, 18h53   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 034
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 034
Points : 18 326
Points : 18 326
Envoyer un message via MSN à CinePhil
Euh... c'est normal que tu cherches des clients qui n'ont pas passé commande et tu interroges une table factures ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2008, 09h46   #4
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
Citation:
Envoyé par CinePhil Voir le message
Euh... c'est normal que tu cherches des clients qui n'ont pas passé commande et tu interroges une table factures ?
Oui pour l'instant c'est normal, la table cmd se nomme facture...
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2008, 09h49   #5
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
Citation:
Envoyé par ced Voir le message
Bonjour,

Je ne vois pas, à part dégrader les performances, à quoi peut bien te servir la sous-requête .
La requête suivante ne suffit-elle pas :
Code :
1
2
3
SELECT DISTINCT(facture.numClient)
FROM facture 
WHERE datediff(now(),dateFacture) >= 30
ced
Hello Ced,

Eh bien si je fais ce que tu me dis, j'ai bien les numClients des personnes qui n'ont pas commandé depuis 30 jours mais rien ne me dit que ces memes clients n'ont pas passé une autre commande il y a moins de 30 jours.
Ils peuvent très bien avoir passé une commande hier et une autre il y a plus de 30 jours. Et moi je veux trouver tout ceux inactifs depuis 30 jours.

En espérant avoir été clair..
Merci
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2008, 11h00   #6
Modérateur
 
Avatar de Cybher
 
Homme Michel
Consultant informatique
Inscription : mai 2005
Messages : 3 006
Détails du profil
Informations personnelles :
Nom : Homme Michel
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : Conseil

Informations forums :
Inscription : mai 2005
Messages : 3 006
Points : 4 039
Points : 4 039
peut etre comme ceci (à tester)
Code :
1
2
3
4
SELECT facture.numClient,max(dateFacture)
FROM facture 
GROUP BY numclient
HAVING datediff(now(),max(dateFacture)) >= 30
Cybher est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2008, 11h05   #7
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 409
Points : 6 409
C'est plus clair... Effectivement, c'est logique .
Donc, ce qui dégrade les performances de ta requête, c'est la sous-requête. Avec de grosses tables, dans MySQL, les sous-requêtes se dégradent rapidement...

Donc, tu peux très bien réécrire ta première requête en passant par une jointure externe, dont les performances seront sans doute meilleures :
Code :
1
2
3
4
5
SELECT DISTINCT(f1.numClient)
FROM facture f1
LEFT OUTER JOIN facture f2 ON f1.numClient = f2.numClient AND datediff(now(), f2.dateFacture) <30
WHERE (datediff(now(), f1.dateFacture)>=30) 
AND f2.numClient IS NULL
ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/08/2008, 11h53   #8
Membre actif
 
Inscription : mai 2004
Messages : 478
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 478
Points : 154
Points : 154
Envoyer un message via MSN à maysa
Citation:
Envoyé par Cybher Voir le message
peut etre comme ceci (à tester)
Code :
1
2
3
4
SELECT facture.numClient,max(dateFacture)
FROM facture 
GROUP BY numclient
HAVING datediff(now(),max(dateFacture)) >= 30
Effectivement oui ça marche, mais curieusement hier en la faisant, je n'avais pas les memes données. Mais elle est beaucoup plus rapide , merci

Ced, c'est vrai j'avais oublié cette technique, mais curieusement elle est encore plus longue que ma requete imbriquée !
maysa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h02.


 
 
 
 
Partenaires

Hébergement Web