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

PHP & Base de données Discussion :

Résultats différents avec mysql_query() et dans PhpMyAdmin [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Résultats différents avec mysql_query() et dans PhpMyAdmin
    Bonjour,

    Je suis confronté à un petit problème embêtant depuis quelques temps maintenant.

    Je cherche à supprimer des doublons dans une table après avoir effectué un INSERT, le traitement est effectué de la manière suivante :

    Tout d'abord l'insert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT 
    INTO matable (col1, col2, col3 ...) 
    VALUES (val1, val2, val3, ...), (val1', val2', val3' ...)
    Ensuite j'appelle ma fonction supprdoublons qui crée cette requête (la requête est générée automatiquement en fonction du nom de la table) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT cust_id 
    FROM customers t1 
    WHERE t1.cust_id > ANY (SELECT cust_id 
                                      FROM customers t2 
                                      WHERE t1.cust_id <> t2.cust_id 
                                            AND t1.cust_sold_to = t2.cust_sold_to 
                                            AND t1.cust_ship_to = t2.cust_ship_to 
                                            AND t1.cust_group = t2.cust_group 
                                            AND t1.cust_name = t2.cust_name )
    En théorie je suis donc en possession des id (cust_id est clé primaire) des entrées doublées.
    Mais lorsque ceci s'exécute dans mon script php, ça ne marche pas, il me renvoie l'intégralité des id présents dans ma table tandis que lorsque je copie mot pour mot la requête dans phpmyadmin il n'y a pas de soucis...
    Bizarre...
    Quelqu'un a une idée ?

    Merci d'avance

  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
    Ceci :
    Citation Envoyé par Hitchou Voir le message
    (la requête est générée automatiquement en fonction du nom de la table) :
    implique que la requête réelle peut ne pas être celle-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT cust_id 
    FROM customers t1 
    WHERE t1.cust_id > ANY (SELECT cust_id 
                                      FROM customers t2 
                                      WHERE t1.cust_id <> t2.cust_id 
                                            AND t1.cust_sold_to = t2.cust_sold_to 
                                            AND t1.cust_ship_to = t2.cust_ship_to 
                                            AND t1.cust_group = t2.cust_group 
                                            AND t1.cust_name = t2.cust_name )
    Il faudrait faire un echo de la requête réellement envoyée au serveur pour vérifier que c'est la même.

    Par ailleurs, je ne pense pas que cela soit à l'origine de l'erreur mais je te conseille, quand tu poses un alias, de l'utiliser partout dans la requête. Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT t1.cust_id 
    FROM customers t1 
    ...
    ANY (SELECT t2.cust_id 
             FROM customers t2 
    ...
    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
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Ceci :
    implique que la requête réelle peut ne pas être celle-là :

    Il faudrait faire un echo de la requête réellement envoyée au serveur pour vérifier que c'est la même.
    Le code que j'avais copié est bien issu d'un echo que j'ai réalisé.
    Par contre en fouillant un peu sur le site j'ai vu que mysql ne gérait pas ANY et SOME j'ai donc essayé de passer par une autre requête, à savoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT count(*), cust_id, cust_sold_to, cust_ship_to, cust_group, cust_name 
    FROM customers 
    GROUP BY cust_sold_to, cust_ship_to, cust_group, cust_name 
    HAVING count(*) > 1
    (que j'ai affichée avec echo)

    Et qui fonctionne très bien maintenant, comme quoi le soir en étant fatigué on n'est pas très productif !

    J'indique donc résolu !
    Merci

  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
    Attention ! Dans le résultat de ta requête, cust_id sera purement aléatoire car il ne fait pas partie du GROUP BY et n'est pas dans la fonction de calcul.
    Un autre SGBD refuserait cette syntaxe.

    Par contre en fouillant un peu sur le site j'ai vu que mysql ne gérait pas ANY et SOME j'ai donc essayé de passer par une autre requête, à savoir
    Il me semblait aussi qu'il y avait un problème avec ANY sur MySQL mais dans la doc, cela figure bien.

    Sinon tu peux aussi essayer cette requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT t1.cust_id 
    FROM customers t1 
    WHERE EXISTS (
      SELECT * 
      FROM customers t2 
      WHERE t1.cust_id <> t2.cust_id 
        AND t1.cust_sold_to = t2.cust_sold_to 
        AND t1.cust_ship_to = t2.cust_ship_to 
        AND t1.cust_group = t2.cust_group 
        AND t1.cust_name = t2.cust_name
    )
    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
    Futur Membre du Club
    Inscrit en
    Février 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Oui mais cette requête me renvoie toutes les clés qui possèdent un doublons.
    Mon but est ensuite de les supprimer de manière à ne garder qu'une entrée.

    Au final j'ai donc effectué :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT count(*), min(cust_id), cust_sold_to, cust_ship_to, cust_group, cust_name 
    FROM customers 
    GROUP BY cust_sold_to, cust_ship_to, cust_group, cust_name 
    HAVING count(*) > 1
    qui est plus appropriée au traitement que j'effectue

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

Discussions similaires

  1. [PHP 5.3] Résultat différent avec IE8
    Par pierrot10 dans le forum Langage
    Réponses: 3
    Dernier message: 14/03/2011, 15h47
  2. OpenMp : résultats différents avec prog. parallélisé
    Par ant12oine dans le forum Fortran
    Réponses: 1
    Dernier message: 02/03/2010, 14h48
  3. import d'une bdd avec les données dans phpmyadmin
    Par lodan dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/10/2006, 19h05
  4. [PHPMyAdmin]Problème avec "Not Null" dans mysql 5
    Par Ryan Sheckler dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/12/2005, 14h45
  5. [W3C] Résultats différents avec IE ou FF
    Par Linoa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 17/11/2005, 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