Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SQL] SUM de deux tables différentes

Sujet résolu
2 août 2010 à 15:23:41

Bonjour les zéros !

Je vais essayer d'être clair;

J'ai deux tables:

TABLE A : id | joueur_id | points
TABLE B : id | joueur_id | points_speciaux

En une seule requete, j'aimerais resortir le total de points+points_speciaux pour le joueur_id X.

Avez vous déjà été confronté au même cas?


D'avance merci,
Alex
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 15:36:57

Je dirais qu'avec ça, on récupère le total des points et des points spéciaux de chaque joueur

SELECT (SUM(points) + SUM(points_speciaux)) AS total_points
FROM table_a a
JOIN table_b b ON a.joueur_id = b.joueur_id
GROUP BY a.joueur_id
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 15:51:02

Je dirai même plus qu'avec ça tu récupères le total des points pour le joueur_id X comme demandé :
SELECT (SUM(points) + SUM(points_speciaux)) AS total_points
FROM table_a a
JOIN table_b b ON a.joueur_id = b.joueur_id
WHERE a.joueur_id = 'X'
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 15:58:24

il y a plusieurs lignes de points par joueur ?

car je ne vois pas l'interet du sum sinon ^^

  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 16:19:38

Mieux vaut prévenir que guérir ^^
Mais sinon tu as raison ils ne serviront pas à grand chose s'il n'y a qu'une seule ligne par joueur.
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 16:21:45

Enfin si y a qu'une ligne par joueur, autant merger et faire une seule table avec points et points_speciaux ...
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 17:45:29

Hello,

Merci pour vos réponses !

Je reviens vers vous pour une dernière chose, si je n'ai pas d'enregistrement dans points_speciaux, malheureusement, la requete me retourne rien...

Comment puis-je faire?

Merci,
Alex
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 18:50:20

LEFT JOIN au lieu de seulement JOIN et c'est bon.

Sinon la réponse à la question (y a-t-il plusieurs lignes de points ou points_speciaux par joueur ?), personnellement c'est comme ça que je l'ai compris mais bon.
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 19:22:44

Merci,
malheureusement, si il n'y a pas d'enregistrement dans la table B, ça ne marche toujours pas:

SELECT (SUM(a.points) + SUM(b.points_speciaux)) AS Total
                FROM table a
                LEFT JOIN tableb b ON a.joueur_id = b.joueur_id
                WHERE a.joueur_id = 2 AND b.joueur_id = 2



Une autre piste? J'ai regardé la doc d'SQL et aucune aide :/
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 19:34:08

Tu n'as toujours pas répondu à notre question !

Y-a-t'il plusieurs lignes dans la table a ou la table b PAR joueurs ?
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 19:36:03

Table A = Une seule ligne
Table B = Une seule ou aucune ligne mais dans un futur lointain, surement plusieurs.
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 19:37:19

Déjà tu peux enlever le : AND b.joueur_id = 2
Ca ne sert à rien de définir les 2 vu que tu fais une jointure.
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 19:40:00

Oui, je l'avais enlevé dans mes tests :)
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 19:40:47

SELECT (points + points_speciaux) AS total_points
FROM table_a a
LEFT JOIN table_b b ON a.joueur_id = b.joueur_id
WHERE a.joueur_id = :id


Comme le dit BlueRat, il fallait supprimer le AND, si ton membre n'a pas de ligne dans la table B, mais que t'as un WHERE qui agit dessus forcément il va rien trouver !
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 19:54:08

Eh bien, en cas de 0 enregistrement dans la table B, ça retourne toujours rien... Alors que lorsqu'il y en a un, ça retourne le Total.

J'avoue que je ne comprends pas tout là !
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 20:07:47

salut!
si ta table b est completement vide la clause
ON a.joueur_id = b.joueur_id aura bien du mal à se faire
rajoute une fonction d'erreur à la fin de ta requete et vois
ce que ça te retourne!
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 20:21:05

mysql_error() ne retourne rien... juste quand je fais un print_r du fetch_assoc, ca me retourne :

Array ( [Total] => )
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 20:26:14

Hum MySQL n'est donc pas capable de comprendre que NULL = 0 quand on fait une addition donc fait comme ça

SELECT points + IFNULL(points_speciaux,0) AS total
FROM table_a a
LEFT JOIN table_b b ON a.joueur_id = b.joueur_id
WHERE a.joueur_id = :id



akram, rien à voir avec la jointure, c'est juste que dans une jointure externe si dans la table b il n'y a pas de correspondance, toutes les colonnes de la table b contiendra NULL.
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 20:47:29

ou definir la valeur default = O pour la colonne concernée
(points_ speciaux) dans la bdd!
zazou, oui je me suis mal exprimé ou je voulais dire que l'addition des champs va etre difficile( valeur + rien = ?)
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 20:51:53

Ca ne sert à rien de mettre une valeur par défaut dans la table contenant les points spéciaux car ça ne fonctionne pas s'il n'y a aucune ligne.
La requête de Zazou reste le meilleur moyen de résoudre ce problème.
  • Partager sur Facebook
  • Partager sur Twitter
2 août 2010 à 21:36:18

Oui, vraiment merci à tous et particulièrement Zazou.

A bientot !
  • Partager sur Facebook
  • Partager sur Twitter
18 septembre 2021 à 9:26:04 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


18 septembre 2021 à 18:06:02

@IssihakaNasser Bonsoir, merci de ne pas déterrer d'ancien sujet résolu. Merci de créer le votre.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter