Mysql sum sur 2 tables

  • Auteur de la discussion Auteur de la discussion Recif
  • Date de début Date de début
WRInaute impliqué
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
 
WRInaute accro
Fais un
Code:
select * from table1 as r, table2 as t

Tu vas vite comprendre ce qui pose problème.
 
WRInaute impliqué
Ben non, je ne vois pas... Je remarque bien qu'il y a pletor de colonnes mais pourquoi, ça...
 
WRInaute impliqué
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.
 
WRInaute accro
Recif a dit:
Qu'est ce qui manque dans ma syntaxe?
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:
 
WRInaute impliqué
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;
 
WRInaute impliqué
Ce qui revient à faire ce que j'ai écrit, non ?

J'ai pas testé, mais ça me semble identique...
 
WRInaute impliqué
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
 
WRInaute passionné
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.
 
WRInaute impliqué
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... :-)
 
WRInaute passionné
Dolph a dit:
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... :-)
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).
 
WRInaute impliqué
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...
 
WRInaute impliqué
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.
 
WRInaute impliqué
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)
 
Discussions similaires
Haut