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 :

ne pas renvoyer les doublons


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 615
    Points : 841
    Points
    841
    Par défaut ne pas renvoyer les doublons
    Bonjour,
    Je voudrais faire une requête qui ne renvoie que les valeurs différentes d'un champ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select datefact,distinct(no_fact)
    from facture
    where datefact between '20100101' and '20100115'
    j'ai une erreur 1064 : erreur de syntaxe.
    Je ne trouve pas quelle syntaxe il faut que j'utilise pour ne pas avoir de doublons dans ma requêtes
    Merci d'avance
    Gancau

  2. #2
    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
    DISTINCT opère sur l'ensemble des colonnes du SELECT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT col1, col2
    FROM la_table
    Cette requête donnera tous les couples différents {col1, col2} de la table.

    Ceci dit, il me semble étrange qu'une facture puisse avoir plusieurs datefact et qu'un no_fact apparraisse plusieurs fois dans une table des factures !

    Le DISTINCT est donc à mon avis inutile dans ce cas précis.
    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 !

  3. #3
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 615
    Points : 841
    Points
    841
    Par défaut
    Bonjour
    J'ai d'une part simplifié ma requête pour donner un exemple avec 2 colonnes et le fait que je souhaitais un distinct sur une colonne et pas sur l'ensemble de l'enregistrement.
    En fait je ne sais pas comment cela est arrivé mais j'ai une même facture affectée à 2 clients différents.
    Du coup, dans mes stats, comme je les sors par client, j'ai ma facture en double et donc mon CA trop élevé.
    Ne me demande pas comment ils ont fait cette manip, je n'en ai aucune idée !!!
    J'aurais donc aimé n'avoir qu'une fois la facture dans ma somme.
    Mais si Mysql ne permet pas de faire un distinct sur une seule colonne, il faut que je me débrouille autrement.
    Merci
    Gancau

  4. #4
    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
    Ce n'est pas impossible à faire mais il faudrait définir le critère qui permet de sélectionner l'une des deux lignes en double.

    Donne nous la structure complète des tables impliquées et la description détaillée du besoin.
    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 !

  5. #5
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Ça sent quand même le défaut de conception.
    Le code client devrait être une clé étrangère dans la table des factures, et le no de la facture un identifiant UNIQUE.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  6. #6
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 615
    Points : 841
    Points
    841
    Par défaut
    Merci
    le défaut de conception est quasi sûr !
    Avoir permis à la base d'avoir plusieurs N) de factures identiques et idem sur les N° de dossier !!!
    J'ai repris ce programme qui tourne depuis avant 2000 et qui était en base Omnis.
    Le developpeur qui avait fait la plus grande partie du prog a migré la base vers mysql et depuis nous n'avons plus de nouvelles et j'ai repris le flambeau.
    Dans son code Omnis il ne renvoie qu'une fois la facture (mais je ne connais pas bien omnis). Grosso modo, il récupère tout dans une table et ensuite il fait le ménage de ce qu'il veut ou pas. Je ne trouve pas cela terrible. Faut dire qu'à l'époque il n'avait peut être pas trop de possibilités !
    J'ai 4 tables :
    Ffacture : la table contenant les factures / avoirs
    Ffacture2 qui contient le détail de chaque facture
    Affaire (ce ne sont pas des produits qui sont vendus mais du service): qui contient les dossiers sur lesquels on travaille par exemple le nom d'une société
    Client : les clients facturés, toutes les personnes qui interviennent dans les dossiers.

    voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT AFF_CODE,AFF_NATURE,FD_INIT,FD_NOFACT,FD_NODOSSIER,AFF_DOSSIER,FD_LIB,
    (CASE WHEN FT_TYPE!=1 THEN FD_PUHTNET ELSE FD_PUHTNET*-1  END)  AS Montant
     
    FROM Ffacture2,Ffacture,Affaire
     
    WHERE FT_DTFACT BETWEEN {DateDebut} AND {DateFin}
    AND FD_NODOSSIER=AFF_CODE
    AND FT_CD= FD_NOFACT
     
    ORDER BY AFF_NATURE,FD_INIT,FD_COMPTE
    tout ce qui commence par AFF_ vient de la table affaire
    FD_ vient de FFacture2
    FT de ffacture
    explications des rubriques :

    aff_nature => type d'affaire
    aff_code => N° de dossier (d'affaire)
    aff_dossier => libellé du dossier (ou affaire)
    FT_TYPE => Facture=0 Avoir = 1
    FT_DTFACT => Date de la facture
    FT_CD => N° de facture
    FT_DOSSIER => N° de dossier
    FD_INIT => Responsable de la ligne de détail (à qui sera affecté le Chiffre d'affaire)
    FD_NOFACT => N° de facture
    FD_NODOSSIER => N° de dossier (ou d'affaire)
    FD_LIBELLE => Libellé de la ligne de détail de facturation

    FD_INIT => Responsable de la ligne de détail
    FD_init ce sont les initiales de la personne responsable de la facture

    Le but étant ensuite de regrouper les enregistremetns pour faire des stats par type de dossier (aff_nature) et aussi par responsable (FD_init).

    Comme ma facture est associée 2 fois donc que le logiciel le permet (ça c'est un autre pb) je voudrais l'enlever de ma requête.
    pour info Je ne développe pas en php.

    Merci si vous avez une piste
    Gancau

  7. #7
    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
    Voici ta requête réordonnée et avec la bonne syntaxe normalisée depuis 1992 pour les jointures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT a.AFF_CODE, a.AFF_NATURE,
      f2.FD_INIT, f2.FD_NOFACT, f2.FD_NODOSSIER,
      a.AFF_DOSSIER,
      f2.FD_LIB,
      CASE 
        WHEN FT_TYPE <> 1 THEN FD_PUHTNET 
        ELSE FD_PUHTNET * -1  
      END AS Montant
    FROM Ffacture2 AS f2
    INNER JOIN Ffacture AS fa ON fa.FT_CD = f2.FD_NOFACT
    INNER JOIN Affaire AS a ON f2.FD_NODOSSIER = a.AFF_CODE
    WHERE FT_DTFACT BETWEEN {DateDebut} AND {DateFin}
    ORDER BY a.AFF_NATURE, f2.FD_INIT, f2.FD_COMPTE
    Au passage, en SQL, l'oérateur de différence est <> et non pas != même si MySQL accepte les deux.

    Le but étant ensuite de regrouper les enregistremetns pour faire des stats par type de dossier (aff_nature) et aussi par responsable (FD_init).
    Il faudra donc user du GROUP BY mais quelles statistiques ?

    Comme ma facture est associée 2 fois donc que le logiciel le permet (ça c'est un autre pb) je voudrais l'enlever de ma requête.
    La question reste la même : quelle facture garder ? Le SGBD ne peut pas le savoir tout seul !
    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 !

  8. #8
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 615
    Points : 841
    Points
    841
    Par défaut
    A ta question :
    quelle facture garder : n'importe laquelle !
    Ils n'avaient qu'à pas me faire des doublons : et toc
    je teste ta requête.
    je sais bien que le sgbd prendra la première trouvée et tant pis pour le client qui a ce souci.
    Gancau

  9. #9
    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
    Citation Envoyé par gancau Voir le message
    je teste ta requête.
    Euh... ma requête, c'est la même que la tienne mais sous une autre forme plus conforme à la norme SQL.
    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 !

  10. #10
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2007
    Messages : 615
    Points : 841
    Points
    841
    Par défaut
    Effectivement j'aurais du écrire "je teste ta formulation".
    Bref, cela donne évidement le même résultat !
    Je garde.
    En revanche, j'ai trouvé d'où viennent mes doublons : il s'agit d'un client qui a exporté la base sur un autre logiciel, fait des manips puis ré-importé la base dans notre logiciel. Conclusion quelques lignes ont été importées en double. Comme cela date de plusieurs années, et que ce phénomène ne devrait pas se reproduire, il n'y a pas matière à passer des heures dessus. Alors tant pis pour mes 2 ou 3 factures en double.
    Merci pour votre aide à tous les 2
    Gancau

  11. #11
    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
    Citation Envoyé par gancau Voir le message
    En revanche, j'ai trouvé d'où viennent mes doublons : il s'agit d'un client qui a exporté la base sur un autre logiciel, fait des manips puis ré-importé la base dans notre logiciel.
    Ce qui démontre une fois de plus que l'intégrité des données doit être contrôlée au maximum par la BDD et non pas par le logiciel !
    Sujet ardemment débattu dans cette discussion.
    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 !

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

Discussions similaires

  1. Ne pas sélectionner les doublons
    Par djimaestro dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/02/2009, 14h05
  2. Ne pas renvoyer les valeurs NULL
    Par David78180 dans le forum SQL
    Réponses: 6
    Dernier message: 07/11/2008, 14h40
  3. ne pas afficher les doublons
    Par zangel dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 05/10/2008, 18h06
  4. Réponses: 6
    Dernier message: 25/04/2008, 12h44
  5. ne pas afficher les doublons
    Par axamen dans le forum SQL
    Réponses: 17
    Dernier message: 23/05/2007, 13h45

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