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 :

Requete qui retourne une somme supérieure à la somme réelle.


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Requete qui retourne une somme supérieure à la somme réelle.
    Bonjour tout le monde,

    C'est mon tout premier message ici, je demande donc un peu d'indulgence si je pose mal ma quetion

    En fait voici ma requete :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql = mysql_query("select sum(affichages.nb), sum(clics.nb) 
    from affichages left join clics on clics.idformat = '$idformat' and clics.dest='$_SESSION[ids]' and clics.date like '$date_stats%'
    where affichages.idformat = '$idformat' 
    and affichages.dest='$_SESSION[ids]' 
    and affichages.date like '$date_stats%'");
    Tout fonctionne bien, sauf que les sommes de affichages.nb et clics.nb retournées sont très largement supérieures aux sommes réelles. De quoi cela pourrait venir ?

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Premières intuitions:
    • il ne te manque pas un GROUP BY quelque part?
    • tu es sûre que ta jointure te retourne les lignes attendues?
    Ce que je ferais pour vérifier que tout fonctionne:
    1) tester la jointure sans les sommes (SELECT * FROM ...) pour voir si le problème ne vient pas de là
    2) voir s'il ne manque pas d'éventuels GROUP BY puis tester la somme

    Le mieux est de tester tes requêtes à part, en dehors de PHP (dans phpMyAdmin ou autre outil de ce genre) pour voir tout ce qu'elles retournent.

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse, mais j'ai déjà essayé tout ca. Je ne comprends vraiment pas !

  4. #4
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    je ne comprends pas trop sur quel critere tu fais ta jointure entre les 2 tables

    peux tu donner un exemple avec qq tuple, le résultat observé, et le résultat attendu

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    En faite j'essaie d'avoir des statistiques d'affichages et de clics. Sachant que la table d'affichages sera toujours plus remplie que celles des clics, je mets la table clics en jointure.... Les deux tables ont des champs identiques. Je veux donc prendre la somme d'affichages et la somme de clics pour l'id du site qui est dans le champ dest, idem pour le format et la date. Mais peut être qu'il manque quelque chose dans ma requete ?

    Je peux tout à fait faire deux select indépendants mais je peux éviter...

  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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    je crois que tu n'a pas trop compris à quoi servait une jointure
    s'il n'ya pas de relation entre tes tables, les enregistrements vont etre dupliqué

    prenon un exemple de deux tables ayant juste une colone
    table 1 avec les valeurs 1 et 2
    table 2 avec les valeurs 3 et 4
    table 1 join table 2 va te sortir
    - 1 3
    - 1 4
    - 2 3
    - 2 4
    dc tu duplique tes enregistrement si tu n'a pas de critere de jointure

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Dans le cas de ma requete il faudrait donc quoi comme critère ?

    Désolé mais si je poste c'est justement pour avoir de l'aide.

  8. #8
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    si je comprends tu as une table affichage, une table clic et tu veux compter le nombre de clic et le combre d'affichage c'est bien cela?
    il n'ya aucune liaison entre clic et affichage? genre un id de clic référencé pour trouvé l'affichage correspondant?

    je t'ai justement demandé un jeu d'essai avec le résulatat afin de meiux comprendre ton probleme

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Je l'ai dis dans mon premier message, les valeurs retournées sont 100 fois supérieures à la réalité.

    Je procède de cette facon pour beaucoup d'autres requetes et j'enai jamais rencontré ce type de problème.... donc je pense avoir compris les jointures !

    La seule différence c'est que c'est la première fois que j'ai besoin de faire deux sum() sur deux tables. Et je me demande si c'est pas de là que vient le problème.

  10. #10
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    bon je ne vois pas

    et comme tu ne sembles pas disposé a donner le code pour créer tes tables et insérer quelques enregistrements pour faire des tests, je passe mon tour

    bon courage

    Michel

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Désolé je n'avais pas compris ce que tu demandais.

    Voici les structures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    #
    # Structure de la table `affichages`
    #
     
    CREATE TABLE affichages (
      id int(10) unsigned NOT NULL auto_increment,
      idsite mediumint(6) unsigned NOT NULL default '0',
      idformat smallint(2) unsigned NOT NULL default '0',
      idban int(10) unsigned NOT NULL default '0',
      dest mediumint(6) unsigned NOT NULL default '0',
      nb int(10) unsigned NOT NULL default '0',
      date date NOT NULL default '0000-00-00',
      PRIMARY KEY  (id),
      KEY idsite (idsite),
      KEY idformat (idformat),
      KEY idban (idban),
      KEY dest (dest)
    ) TYPE=MyISAM;
    # --------------------------------------------------------
     
    #
    # Structure de la table `clics`
    #
     
    CREATE TABLE clics (
      id int(10) unsigned NOT NULL auto_increment,
      idsite mediumint(6) unsigned NOT NULL default '0',
      idformat smallint(2) unsigned NOT NULL default '0',
      idban int(10) unsigned NOT NULL default '0',
      dest mediumint(6) unsigned NOT NULL default '0',
      nb int(10) unsigned NOT NULL default '0',
      date date NOT NULL default '0000-00-00',
      PRIMARY KEY  (id),
      KEY idsite (idsite),
      KEY idformat (idformat),
      KEY idban (idban),
      KEY dest (dest)
    ) TYPE=MyISAM;

  12. #12
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    encore quelques enregistrements pour insérer dans les tables si c'est possible (comme c'est conseillé dans les regles)

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Désolé je suis nouveau ici, merci de ddoner de ton temps.

    Voici un fichier joint avec quelques lignes.
    Fichiers attachés Fichiers attachés

  14. #14
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    je pense qu'avec une jointure, tu va ramener plusieur fois le meme enregistrement, c'est pour cela que tu as un nombre plus grand
    qu'est ce qui t'embete pour faire deux requetes?

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Ca ne m'embete pas, c'est juste qu'on m'a toujours expliqué qu'il fallait toujours faire le moins de requetes possibles alors j'essaie de suivre les conseils

  16. #16
    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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    il faut mieux éviter de faire deux requetes quand on peut en faire une si ta 2eme requete depend du résultat de la 1ere

    A mon avis, ici cela ne gene pas de faire deux requetes (enfin je suis loin détre un expert sur ce qu'il faut mieux faire)

    pour le faire en une requete, ceci (meme si ce n'est pas tres beau) devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select sum(affichages.nb), 
    (sum(clics.nb) from clics 
    where clics.idformat = '$idformat' and 
    clics.dest='$_SESSION[ids]' and 
    clics.date like '$date_stats%')
    from affichages 
    where affichages.idformat = '$idformat' 
    and affichages.dest='$_SESSION[ids]' 
    and affichages.date like '$date_stats%'");

  17. #17
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Vu que l'on n'utilise pas "les clics d'un affichage" ou "les affichages d'un clic" il n'y pas pas de jointure (d'ailleurs dans la requête d'origine il n'y a pas de condition liant les deux tables, comme "clics.idaffichage=affichage.id"). Tenter d'en mettre une de force va provoquer une démultiplication des lignes et tout fausser (en plus d'être super lent, le "LEFT JOIN" n'aidant pas). Il s'agit de deux sommes différentes portant sur des objets différents (elles porteraient sur la même table ce serait différent) donc on a deux requêtes distinctes.

    Pour éviter de faire de vraies sous-requêtes il serait possible d'utiliser (avec un mysql assez récent) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT 
       (SELECT sum(affichages.nb) FROM affichages 
        WHERE affichages.idformat = '$idformat' 
          AND affichages.dest = '$_SESSION[ids]' 
          AND affichages.date LIKE '$date_stats%'),
       (SELECT sum(clics.nb) FROM clics 
        WHERE clics.idformat = '$idformat'
          AND clics.dest = '$_SESSION[ids]'
          AND clics.date LIKE '$date_stats%')
    mais je ne sais pas si c'est plus rapide. A moins d'avoir des problèmes de performances avérés je crois que c'est se prendre la tête pour rien.

Discussions similaires

  1. Requete qui retourne une date précédée par un même préfixe
    Par Rozgann dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/07/2009, 15h32
  2. [MySQL] requete qui retourne une erreur a l'execution
    Par naazih dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 18/05/2008, 13h59
  3. Requete SQL qui retourne une erreur
    Par gregal dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/03/2008, 00h05
  4. Réponses: 10
    Dernier message: 13/08/2007, 17h12
  5. Réponses: 10
    Dernier message: 28/07/2007, 16h53

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