IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Recherche des clients qui n'ont pas commandé depuis plus de 30 jours


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT(facture.numClient)
    FROM facture 
    WHERE datediff(now(),dateFacture) >= 30
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    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...

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 641
    Points
    4 641
    Par défaut
    peut etre comme ceci (à tester)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT facture.numClient,max(dateFacture)
    FROM facture 
    group by numclient
    having datediff(now(),max(dateFacture)) >= 30

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Points : 201
    Points
    201
    Par défaut
    Citation Envoyé par Cybher Voir le message
    peut etre comme ceci (à tester)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/11/2006, 18h26
  2. Réponses: 6
    Dernier message: 19/06/2006, 10h48
  3. Réponses: 4
    Dernier message: 08/06/2006, 13h18
  4. la liste des clients qui n'ont pas acheter aucun article ...
    Par TéBeSsI dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/02/2004, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo