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

Langage SQL Discussion :

Problème d’extraction sur critères


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut Problème d’extraction sur critères
    Bonjour,
    je n'arrive pas à extraire d'une seule table les enregistrements selon certains critères.

    ma table ps_order_history contient tous les enregistrements des différents états qu'ont eu mes commandes. Donc beaucoup d'enregistrements.

    Nom : exemple_bdd_order_history.PNG
Affichages : 230
Taille : 38,9 Ko

    voici un exemple d'une partie de la table.

    Ce que je veux obtenir par une requête c'est tous les id_order (numéro de la commande) dont le dernier id_order_state =14 (état reliquat sur la commande)

    en faite en langage normal je veux connaitre et avoir une liste de toutes les commandes qui sont en reliquat (id_order_state=14) au moment ou jje lance ma requete

    J'ai essayé en premier lieu a obtenir une liste représentant le dernier état de toutes les commandes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX( id_order_history ) , id_order, id_order_state FROM ps_order_history GROUP BY id_order
    Le problème c'est que deja ça ne me donne pas le bon résultat.
    Cette requete me retourne bien le dernier id_order_history d'une commande , le bon num de la commande, mais par contre elle ne me donne pas l'id_order_state correspondant au id_order_history

    je vous montre un exemple sur une seule commande
    Nom : exemple_bdd_order_history2.PNG
Affichages : 148
Taille : 19,0 Ko

    sur cette commande la requete va me donner :
    id_order_history=17192
    id_order=1
    id_order_state=8

    le résultat que je veux c'est:
    id_order_history=17192
    id_order=1
    id_order_state=6

    est ce que deja ce que je veux obtenir est réalisable?

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Je suppose que tu travailles avec MySQL, car n'importe quel SGBD digne de ce nom aurait rejeté ta requête.
    En effet, la colonne id_order_state doit être dans le GROUP BY car elle ne fait l'objet d'aucune fonction d'agrégation.

    Pour ta recherche, tu peux faire par exemple ainsi:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.*
    from MaTable as t1
    inner join MaTable as t2 on t1.id = t2.id and t1.DateEffet < t2.DateEffet
    where t2.id is null
    Il y a d'autres solution, par exemple avec une sous-requête. Il suffit de faire une recherche sur le forum pour trouver d'autres pistes.

    Tatayo.

  3. #3
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    je travail sur une seule et unique table. Si je remplace MaTable pas le nom de ma table , DateEffet par date_add et id par id_order_history
    ta requête retourne rien

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Il ne faut pas utiliser id_order_history, mais id_order, puisque tu cherches le dernier historique pour chaque commande.

    Tatayo.

  5. #5
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    j'obtient le même résultat

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Tu peux nous montrer ta requête ?

    Tatayo.

  7. #7
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t1 . * 
    FROM ps_order_history AS t1
    INNER JOIN ps_order_history AS t2 ON t1.id_order = t2.id_order
    AND t1.date_add < t2.date_add
    WHERE t2.id_order IS NULL

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Oups, grosse erreur de ma part !
    Il faut utiliser une jointure externe !
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT t1.* 
    FROM ps_order_history AS t1
    LEFT OUTER JOIN ps_order_history AS t2 ON t1.id_order = t2.id_order
    AND t1.date_add < t2.date_add
    WHERE t2.id_order IS NULL

    Voilà ce qui arrive quand on fait plusieurs choses en même temps...

    Tatayo.

  9. #9
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    Merci beaucoup de ton aide. Je l'ai amélioré afin d'avoir dans le résultat que celles dont le statu est 14. Tout marche niquel.

    par contre je ne pige pas du tout comment ta requête fait

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Elle renvoie toutes les lignes de la table pour laquelle il n'existe pas d'autre ligne avec le même id_order, mais une date de saisie postérieure.
    Il suffit d'enlever le WHERE pour mieux comprendre.

    Une autre façon de faire est d'utiliser un NOT EXIST au lieu d'une jointure externe.

    Tatayo.

  11. #11
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    Merci pour ton explication. Je n'aurai jamais penser faire ma requête comme cela.
    Encore Merci

  12. #12
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    @tatayo, je ne suis pas fan des jointures sans équité, et à mon avis le SGBD non plus.

    @elwy07, essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select t1.*
      from ps_order_history   as t1
      join ( select id_order, max(date_add) as date_add
               from ps_order_history
           group by id_order) as t2  on t2.id_order = t1.id_order
                                    and t2.date_add = t1.date_add;

  13. #13
    Membre du Club
    Femme Profil pro
    Webmaster
    Inscrit en
    Octobre 2014
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2014
    Messages : 98
    Points : 48
    Points
    48
    Par défaut
    @Waldar ta requête est très très lente d’exécution contre 30sec pour celle de @tatayo

  14. #14
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Ahah, comme quoi on a toujours des surprises avec MySQL !
    Essayez toutefois de créer un index sur (id_order, date_add).

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

Discussions similaires

  1. [XL-2013] problème sur critère texte/numérique de SOMME.SI.ENS
    Par Pierre Dumas dans le forum Excel
    Réponses: 5
    Dernier message: 29/02/2016, 14h33
  2. [CR XI] Problème sur critère de sélection facultatif
    Par juju05 dans le forum Débuter
    Réponses: 2
    Dernier message: 01/02/2012, 15h02
  3. [WD14] Importation Excel via OLE DB : Problème sur critère date
    Par Genohunter dans le forum WinDev
    Réponses: 2
    Dernier message: 16/09/2009, 18h03
  4. Problème recherche sur critère
    Par Sendo dans le forum Access
    Réponses: 1
    Dernier message: 08/03/2006, 00h51
  5. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 14h17

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