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 :

Requette mysql envoi une résultat eronné


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut Requette mysql envoi une résultat eronné
    J'utilise un server apache 2.2 avec MySQL 5.0.24a-Debian.

    Quand je lance la requette suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT `DOSSIER`.`DOS_ID` , `DOSSIER`.`DOS_EMPR_NOM` , `DOSSIER`.`DOS_EMPR_PRENOM` , `DOSSIER`.`DOS_DATE_PHASE1` , `NET_MANAGER`.`DOS_ID` , `NET_MANAGER`.`DOS_OWNER`
    FROM DOSSIER, NET_MANAGER
    WHERE (`DOSSIER`.`DOS_ID` = `NET_MANAGER`.`DOS_ID`)
    AND (`NET_MANAGER`.`DOS_OWNER` =47000)
    AND (`DOSSIER`.`DOS_DATE_PHASE1` >= '2006-11-15 00:00:00');
    je reçoit un résultat erroné!

    J'ai deux tables dans ma BD.
    La premiere s'appel : DOSSIER (Primary Key = DOS_KEY )
    et la deuxième s'appel : NET_MANAGER (primary Key = I_DB_ID )

    Extraits des deux resultats de ma requette:

    DOS_ID DOS_EMPR_NOM DOS_EMPR_PRENOM DOS_DATE_PHASE1 DOS_ID DOS_OWNER
    25121 PILLE VINCENT 2006-12-01 00:00:00 25121 47000
    25121 MIRICHO YANNIK 2006-12-01 00:00:00 25121 47000
    Quand je regarde dans ma base de données et plus particulièrement l'enregistrement de "Pille Vincent" je constate que le champs NET_MANAGER`.`DOS_OWNER` indique le chiffre "24000" et pas "47000". Cela veut dire que la requette me retourne des enregistrements doublement erroné!

    1. L'enregistrement de "Pille Vincent" ne devrait pas y figurer dans la liste de resultat !
    2. Et si l'enregistrement de "Pille Vincent" est affiché, le lode postal dervait y être "24000" et pas "47000" !

    Ou est le BUG?

    Dans ma liste de resultats figurent d'autres enregistrements erroné, même principe .... c'est à dire cela concerne les enregistrements donc le champs `DOSSIER`.`DOS_ID` est identique entre deux enregistrements ....

    Merci d'avance pour votre aide.

  2. #2
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Les colonnes de la requête SQL ne correspond pas à celles du résultat. C'est normal ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Adjanakis, Merci pour ton commentaire.

    Bien vu j'ai corrige mon article, requette correspondant au résultat d'écran, par contre cela ne change rien au problème qui reste d'actualté ....

  4. #4
    Membre éclairé Avatar de cadoudal56
    Profil pro
    Inscrit en
    Février 2005
    Messages
    694
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 694
    Points : 779
    Points
    779
    Par défaut
    Hello,

    Il me semble que la facon dont tu rediges ta jointure est déconseillée car source de probleme (mais me demande pas pourquoi...)

    Essaie ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT D.DOS_ID, D.DOS_EMPR_NOM, D.DOS_EMPR_PRENOM, D.DOS_DATE_PHASE1, N.DOS_ID, N.DOS_OWNER
    FROM DOSSIER AS D
    JOIN NET_MANAGER AS N ON N.DOS_ID = A.DOS_ID
    WHERE N.DOS_OWNER =47000
    AND D.DOS_DATE_PHASE1 >= '2006-11-15 00:00:00';
    Et dis nous ce que cela donne

    @+
    cadou

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Points : 220
    Points
    220
    Par défaut
    il faut peut etre poster les colonnes de chaque tables parce que la:
    tu affiches le nom de la table dossier qui est par exemple PILLE
    mais tu dis que l'enregistrement de PILLE sous NET_MANAGER contient 4700
    tu confonds peut etre les 2 colonnes.
    tu fais la jointures sur dos_id des 2 tables, faudrait peut etre rajouter le nom dans la jointure

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Salut cadoudal56 et coca25,

    Merci pour votre aide.

    cadoudal56, j'ai essayé ton code avec une petite correction sur "A.DOS_ID" .... et la requette suivante


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT D.DOS_ID, D.DOS_EMPR_NOM, D.DOS_EMPR_PRENOM, D.DOS_DATE_PHASE1, N.DOS_ID, N.DOS_OWNER
    FROM DOSSIER AS D
    JOIN NET_MANAGER AS N ON N.DOS_ID = D.DOS_ID
    WHERE N.DOS_OWNER =47000
    AND D.DOS_DATE_PHASE1 >= '2006-11-15 00:00:00'
    ORDER BY D.DOS_ID
    produit la sortie d'écran suivante:


    .... j'avais de l'espoir d'avoir un resultat correct, mais je pas de chance, les erreurs sont toujours présent!

    Quand j'execute la requette suivante ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT D.DOS_ID, D.DOS_KEY, D.DOS_EMPR_NOM, D.DOS_EMPR_PRENOM, D.DOS_DATE_PHASE1, N.DOS_KEY, N.DOS_OWNER
    FROM DOSSIER AS D
    JOIN NET_MANAGER AS N ON N.DOS_KEY = D.DOS_KEY
    WHERE N.DOS_OWNER =24000
    AND D.DOS_DATE_PHASE1 >= '2006-11-15 00:00:00'
    AND D.DOS_ID =25121
    ORDER BY D.DOS_ID
    je reçoit le resultat suivant:



    Vous pouvez bien constater l'erreur une fois DOS_OWNER (chez "Pille") et egal à 47000 et dans l'autre à 24000 ( remarque : 24000 est correct!).

    Je ne comprend rien??? Pourqoui la premiere requette m'envoi un résultat érroné?

  7. #7
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Que vous retourne la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT D.DOS_ID, D.DOS_KEY, D.DOS_EMPR_NOM, D.DOS_EMPR_PRENOM, D.DOS_DATE_PHASE1, N.DOS_ID, N.DOS_OWNER
    FROM DOSSIER AS D
    JOIN NET_MANAGER AS N ON N.DOS_ID = D.DOS_ID
    WHERE N.DOS_OWNER =47000
    AND D.DOS_DATE_PHASE1 >= '2006-11-15 00:00:00'
    ORDER BY D.DOS_ID

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Salut Alexandre_T,

    La requette suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT D.DOS_ID, D.DOS_KEY, D.DOS_EMPR_NOM, D.DOS_EMPR_PRENOM, D.DOS_DATE_PHASE1, N.DOS_ID, N.DOS_OWNER
    FROM DOSSIER AS D
    JOIN NET_MANAGER AS N ON N.DOS_ID = D.DOS_ID
    WHERE N.DOS_OWNER =47000
    AND D.DOS_DATE_PHASE1 >= '2006-11-15 00:00:00'
    ORDER BY D.DOS_ID
    Retourne également le resultat érroné suivant:


    A ce point de l'enquette je ne vois pas de logique pour cette erreur ?... j'ai eu des bons conseils de la part des adhérants de ce forum ..... Donc à ce stade je dirais que l'erreur ne viens pas de la requette mais d'un bug de MySQL 5.x ... Je vais essayer de copier ma BD sur un autre serveur MySQL 4.3.x ... et si l'erreur disparraît ... cela confirmera la piste du bug dans le moteur MySQL.
    C'est une erreur bien tordu!

  9. #9
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Au contraire, je ne trouve pas le résultat erroné. D'ailleurs vous pourrez le vérifier en retournant le résultat des requêtes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * FROM NET_MANAGER WHERE DOS_KEY in (23025,23032)
     
    SELECT * FROM DOSSIER WHERE DOS_KEY in (23025,23032)
    Est-ce une étourderie ou normal que dans votre première requête la jointure entre dossier et net_manager porte sur DOS_ID et dans l'autre requête sur DOS_KEY ?

    En tout cas, que MySQL fasse des erreurs sur une simple jointure, je n'y crois pas du tout ! Par contre, que je n'ai rien compris à votre sujet c'est possible

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Reponse à Alexandre T:

    La requette suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM NET_MANAGER WHERE DOS_KEY IN (23025,23032)
    retourne le resultat (correct) suivant (extraît):


    Comme on voir bien, l'enregistrement DOS_KEY = 23025 est liée au DOS_OWNER = 24000 .

    Alexandre T à écrit:
    Est-ce une étourderie ou normal que dans votre première requête la jointure entre dossier et net_manager porte sur DOS_ID et dans l'autre requête sur DOS_KEY ?
    A l'origine j'ai construit ma requette avec la condition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (`DOSSIER`.`DOS_ID` = `NET_MANAGER`.`DOS_ID`)
    et quand je me suis apperçu du résultat érrone j'ai essayé de trouver une réponse à ce problème. J'ai donc reformulé ma requette en utilisant le champ DOS_KEY (pour simple vérification du résultat) dans une autre requette.

    J'ai entre temps copie ma BD sur un autre serveur (MySQL 4.0.24_Debian-10)
    et le resultat est le même ....

    Je suis a bout des idées ...après tous les essais.

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    est-ce que tu n'aurais pas tout simplement deux PILLE ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT * 
    FROM Dossier
    WHERE DOS_EMPR_NOM = 'Pille'

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Salut Antoun,

    ta requette me retourne aucun enregistrement ... cella est liée à écriture, lettes miniuscules et majuscules.

    Mais je vois ce que tu veut dire ...

    La requette suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM DOSSIER
    WHERE DOS_EMPR_NOM = 'PILLE'
    me retourne un seul enregistrement !

    voire le resultat d'affichage suivant:


  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Bon ... j'ai eu une autre idée .... j'ai vide ma BD en laissant uniquement les deux enregistrements DOS_ID=25121 et je le met en téléchargement à l'adresse suivante:

    bug_db.sql taille fichier 9,08 ko

    Cela permet de reproduire mes demarches ..... tout en isolant le problème (reduction au minimum) .... car la base d'origine pèse 25Mo !

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Points : 220
    Points
    220
    Par défaut
    j'ai pas tout suivi, mais d'apres la base que tu as mis en téléchargement, le résultat de mysql est normal.
    tu fais une jointure sur DOS_ID sur les deux tables or les 4 enregistrements que tu as mis en exemple ont le DOS_ID = 25121 donc la jointure selectionne les 4 enregistrments ensuite elle limite au seul enregistrement de NET_MANAGER qui a DOS_OWNER a 47000 ce qui fait un resultat de 2 enregistrements: normal (c'est ce que j'avais dit au début)

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 157
    Points : 80
    Points
    80
    Par défaut
    Salut Coca25,

    Je voir ce que tu veut dire .... mais le résultat de la requette, (celle qui envoi les informations de "PILLE" avec un code postal érroné - 47000) n'est pas logique pour moi .... et j'ai toujours pas compris...?

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Points : 220
    Points
    220
    Par défaut
    PILLE a un DOS_ID=25121
    moricho a un DOS_ID=25121

    les deux enregistrements que t'as donné pour NET_MANAGER ont un DOS_ID=25121
    le premier a DOS_OWNER = 47000
    le 2eme DOS_OWNER=24000

    une jointure sur le DOS_ID = 25121 donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DOS_OWNER | DOS_ID | NOM
    47000         | 25121     | PILLE
    47000         | 25121     | moricho
    24000         | 25121     | PILLE
    24000         | 25121     | moricho
    tu limites à un DOS_OWNER = 47000
    ca te laisse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DOS_OWNER | DOS_ID | NOM
    47000       | 25121     | PILLE
    47000       | 25121     | moricho
    les deux DOS_DATE_PHASE1 sont supérieur à 2005

    voilà

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Points : 220
    Points
    220
    Par défaut
    après avoir revu le schéma de la base, je crois que tu te trompes simplement sur la condition de jointure, tu devrais la faire avec la colonne DOS_KEY qui est la clé de la table DOSSIER.

Discussions similaires

  1. Lister les champs issus d'une requette [MySql][Api MySql]
    Par jbat dans le forum Bases de données
    Réponses: 1
    Dernier message: 25/06/2009, 16h27
  2. Réponses: 5
    Dernier message: 15/10/2008, 09h08
  3. Update d'une base MySql, pas de résultat, pas d'erreur
    Par EdwinAlan dans le forum Windows Forms
    Réponses: 2
    Dernier message: 29/11/2007, 15h50
  4. Réponses: 6
    Dernier message: 01/05/2007, 23h16
  5. [MySQL] Envoi requete mysql d'une page à une autre
    Par bijour dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/08/2006, 11h28

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