Mysql sum sur 2 tables

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par Recif, 6 Mai 2011.

  1. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    849
    J'aime reçus:
    0
    Bonjour,

    J'essaye d'avoir le total de deux colonnes de deux tables mais les resultats sont faux...

    Code:
    select sum(r.nombre + t.nombre) from table1 as r, table2 as t
    
    J'obtiens un chiffre énorme (119000) alors que le resultat devrait être 5200... 8O

    Qu'est ce qui manque dans ma syntaxe?
    Merci
     
  2. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 249
    J'aime reçus:
    0
    Fais un
    Code:
    select * from table1 as r, table2 as t
    Tu vas vite comprendre ce qui pose problème.
     
  3. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    849
    J'aime reçus:
    0
    Ben non, je ne vois pas... Je remarque bien qu'il y a pletor de colonnes mais pourquoi, ça...
     
  4. Blount
    Blount WRInaute impliqué
    Inscrit:
    18 Novembre 2010
    Messages:
    701
    J'aime reçus:
    0
    C'est parce que tu compte plusieurs fois le même nombre du à ta jointure mal faites (je pense).
    Tu dois joindre entre deux colonnes normalement. Je ne peux pas t'en dire plus vu qu'on ne connaît pas la structure de tes tables.

    Pour les jointures, préfère l'instruction JOIN.
     
  5. Dolph
    Dolph WRInaute impliqué
    Inscrit:
    1 Mars 2011
    Messages:
    556
    J'aime reçus:
    0
    Un truc du style

    Code:
    SELECT SUM(nombre)
    FROM table1
    NATURAL JOIN table2
    
     
  6. Leonick
    Leonick WRInaute accro
    Inscrit:
    8 Août 2004
    Messages:
    19 414
    J'aime reçus:
    0
    visiblement tu fais un produit cartésien de tes tables : chaque ligne est couplée avec chacune des lignes de l'autre table, vu que tu n'as pas défini de relation entre les tables.
    Ce qui fait que si A contient 20 enr et B en contient 100, ton select en contiendra 20x100=2000 :wink:
     
  7. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    849
    J'aime reçus:
    0
    J'ai trouvé un truc qui marche, mais je sais pas si c'est optimisé...

    Code:
    SELECT SUM(tmp.nombre)  FROM (         SELECT nombre
                FROM table1 where actif = '1'
            UNION ALL         
            SELECT nombre
                FROM table2 where actif = '1'
            UNION ALL         
            SELECT nombre
                FROM table3 where actif = '1'
        ) tmp;
     
  8. Dolph
    Dolph WRInaute impliqué
    Inscrit:
    1 Mars 2011
    Messages:
    556
    J'aime reçus:
    0
    Ce qui revient à faire ce que j'ai écrit, non ?

    J'ai pas testé, mais ça me semble identique...
     
  9. Leonick
    Leonick WRInaute accro
    Inscrit:
    8 Août 2004
    Messages:
    19 414
    J'aime reçus:
    0
    si tu as 3 tables, ça me parait correct
     
  10. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    849
    J'aime reçus:
    0
    Marche pas... Résultat : "NULL"
     
  11. Dolph
    Dolph WRInaute impliqué
    Inscrit:
    1 Mars 2011
    Messages:
    556
    J'aime reçus:
    0
    Nan mais faut l'adapter... :)

    Code:
    SELECT SUM(t1.nombre + t2.nombre + t3.nombre)
    FROM table1 t1
    NATURAL JOIN table2 t2
    NATURAL JOIN table3 t3
    WHERE t1.actif = 1 &&  t2.actif = 1 &&  t3.actif = 1
    Et j'suis sur qu'on peu encore optimiser le WHERE
     
  12. Blount
    Blount WRInaute impliqué
    Inscrit:
    18 Novembre 2010
    Messages:
    701
    J'aime reçus:
    0
    Ça irait plus vite en nous donnant la structure minimal des tables …
     
  13. doudouseb
    doudouseb Nouveau WRInaute
    Inscrit:
    14 Mars 2006
    Messages:
    28
    J'aime reçus:
    0
    Et ça :
    SELECT (SELECT SUM(nombre) FROM table1) + (SELECT SUM(nombre) FROM table2)
     
  14. Dolph
    Dolph WRInaute impliqué
    Inscrit:
    1 Mars 2011
    Messages:
    556
    J'aime reçus:
    0
    Ca fait 3 select...
     
  15. Julia41
    Julia41 WRInaute passionné
    Inscrit:
    31 Août 2007
    Messages:
    1 779
    J'aime reçus:
    0
    A mon avis niveau performance :
    SELECT SUM(col1) FROM table1;
    SELECT SUM(col2) FROM table2;
    et tu ajoutes dans ton langage de prog.
    A benchmarker mais je pense que ça sera 10 fois plus rapide que de faire des jointures ou autres.
    Sinon il faudrait passer par une table temporaire.
     
  16. Dolph
    Dolph WRInaute impliqué
    Inscrit:
    1 Mars 2011
    Messages:
    556
    J'aime reçus:
    0
    Ahh un spécialiste de la perf sql.

    T'aurais pas un site qui fait des tests de perf entre différentes requêtes pour un même résultats ou des comparaison entre muti requêtes et requêtes imbriquées.

    Ok, je peux le faire, mais j'ai pas le temps... :)
     
  17. Julia41
    Julia41 WRInaute passionné
    Inscrit:
    31 Août 2007
    Messages:
    1 779
    J'aime reçus:
    0
    Suffit de benchmarker un peu, phpmyadmin donne les résultats.
    Le gros soucis c'est que ça va dépendre énormément du nombre de données et surtout des INDEX.
    Donc bon, les benchmark ne "veulent" rien dire.
    Généralement mes clients me demandent "pourriez-vous me configurer correctement mysql pour que je mette mes données dessus". Moi je leur dis "mettez vos données dessus, après je pourrais configurer".

    Pour les gains de perfs, il faut aussi regarder du côté du moteur de stockage (MyISAM/InnoDB/Memory). Memory est plutôt pas mal pour tout ce qui est "utilisateur en ligne actuellement" et trucs du genre (données pas trop importante et changeant souvent).
     
  18. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    849
    J'aime reçus:
    0
    Marche pas la formule :

    Code:
    SELECT SUM(t1.nombre + t2.nombre + t3.nombre)
    FROM table1 t1
    NATURAL JOIN table2 t2
    NATURAL JOIN table3 t3
    WHERE t1.actif = 1 &&  t2.actif = 1 &&  t3.actif = 1
    
    J'obtiens un résultat vide...
     
  19. Blount
    Blount WRInaute impliqué
    Inscrit:
    18 Novembre 2010
    Messages:
    701
    J'aime reçus:
    0
    Il me semblait bien que ton pseudo me disais quelque chose, tu es l'auteur de notif.fr ? Parce que moi, je suis l'auteur de alerte-leboncoin.ilatumi.org :D
    Par contre, tant qu'on y est, je n'ai jamais réussi à créer une alerte sur ton site avec Firefox 4. Peut-être une erreur JS.

    Sinon, pour revenir au sujet, donne nous donc la structure des tes tables (du moins les colonnes nous intéressant avec clé primaire/étrangère). Ce sera plus facile de t'aider avec les données, parce qu'on peut toujours te filer des requêtes, sans les bonnes colonnes, on ne pourra pas avancer.
     
  20. Recif
    Recif WRInaute impliqué
    Inscrit:
    25 Août 2004
    Messages:
    849
    J'aime reçus:
    0
    Bonjour confrère :wink:
    Je vais regarder pour firefox, merci!

    Pour la table je ne comrpends pas bien ce que ça change de donner la structure complête... Elles sont identiques toutes les 3, avec une colonne "nombre" sur laquelles je souhaitais faire les sommes... Je voulais juste la requête la moins consommatrice en ressources...

    Table:

    ID (idx primaire)
    Nombre (int11)
     
  21. Blount
    Blount WRInaute impliqué
    Inscrit:
    18 Novembre 2010
    Messages:
    701
    J'aime reçus:
    0
  22. Dolph
    Dolph WRInaute impliqué
    Inscrit:
    1 Mars 2011
    Messages:
    556
    J'aime reçus:
    0
    Moi, m'en fout, le code que j'ai donné fonctionne. J'ai testé.

    Na !

    :)
     
Chargement...
Similar Threads - Mysql sum tables Forum Date
SUM de 2 champs identiques dans deux tables mysql différentes Administration d'un site Web 9 Octobre 2014
Quel SGBDR autre que MySQL/MariaDB ? Administration d'un site Web 12 Janvier 2021
encodage texte sur requete mysql Demandes d'avis et de conseils sur vos sites 21 Octobre 2020
Requête MySql imbriquée Développement d'un site Web ou d'une appli mobile 8 Octobre 2020
Supprimer les doublons d'une table mysql Développement d'un site Web ou d'une appli mobile 16 Juin 2020
Mysql migration utf8->utf8mb4 Développement d'un site Web ou d'une appli mobile 17 Août 2019
recherche lettres dans mysql Développement d'un site Web ou d'une appli mobile 11 Juillet 2019
cache mysql maison Développement d'un site Web ou d'une appli mobile 18 Février 2019
Stocker dans des variables php les fonctions MySql Développement d'un site Web ou d'une appli mobile 2 Février 2019
message : [LEGACY][libmysqlclient] Please consider moving to stable and mysqlnd in Administration d'un site Web 8 Novembre 2018