MySQL : problème de requête (jointure union)

Fermé
Welzy - 5 mars 2015 à 12:07
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 - 5 mars 2015 à 12:29
Bonjour,

Hier soir, j'ai passé 2 heures à essayer de faire une requête SQL, mais sans succès : je n'y arrive toujours pas. Du coup, je fais appel à votre aide, en espérant arriver au bout de cette intrigue.


Je vous explique un peu ce que je cherche à faire :

J'ai un système de "stats", où je compte le nombre de votes et de victoire d'un joueur sur un jeu vidéo.


Au total, j'ai 3 tables :

players : idPlayer, login, name, email, ip

votes : idPlayer, month_vote, total_vote

wins : idPlayer, month_win, total_win


Quelques explications :
  • La table "players" contient tous les joueurs.
  • La table "votes" contient uniquement les joueurs qui ont votés (on stock le nombre de votes fait en incrémentant month_vote et total_vote).
  • La table "wins" contient uniquement les joueurs qui ont gagnés (on stock le nombre de victoires en incrémentant month_win et total_win).
  • Afin d'éviter la redondance d'informations, dans les tables "votes" et "wins", je stock uniquement l'idPlayer du joueur. Le but est de récupérer les informations associées aux joueurs en faisant une jointure avec la table "players".



Maintenant que tout est clair, je vous explique ce que je cherche à faire.

J'aimerais une requête SQL qui affiche : login, month_vote, total_vote, month_win, total_win

Concrètement, je veux afficher tous les joueurs qui ont au moins déjà votés 1 fois ou qui on déjà eu une victoire, et récupéré le login associé au joueur à partir de son ID.



Maintenant, je vais vous monter mon raisonnement et ce que j'ai déjà fait...

Ceci retourne uniquement pour les votes (sans les wins) :
SELECT login, month_vote, total_vote
 
FROM votes, players
 
WHERE votes.idPlayer = players.idPlayer


Ceci retourne uniquement pour les wins (sans les votes) :
SELECT login, month_vote, total_vote
 
FROM votes, players
 
WHERE votes.idPlayer = players.idPlayer


Du coup, comme je veux les votes et les wins en même temps, j'ajoute les 3 tables dans la même requêtes, et dans le SELECT, j'ajoute les champs concernés :
SELECT login, month_vote, total_vote, month_win, total_win
 
FROM votes, wins, players
 
WHERE votes.idPlayer = players.idPlayer

Ceci fonctionne bien, mais le problème, c'est que, si une personne n'a PAS voté et à seulement eu une win (victoire), elle ne sera pas retournée car la jointure se fait uniquement entre la table "votes" et "players".

Je veux donc ajouter une "union" avec les wins. Comme ça, si une personne est dans la table "wins" et non dans la table "votes" (et inversement), on récupérera son login associé à partir de son idPlayer qui se trouve dans la table "players".

Bien-sûr, si une personne a seulement eu 1 wins mais qu'elle n'a jamais voté, comme month_vote et total_vote ne seront pas renseignés dans la table "votes", il faut mettre la valeur 0 dans l'affichage finale (puisque MySQL ne pourra pas les SELECT étant donné que les valeurs n'existes pas).

J'ai donc essayé de faire un truc de ce genre, mais cela ne fonctionne pas (il y a des valeurs fausses pour month_win total_win) :
SELECT login, month_vote, total_vote, month_win, total_win
FROM votes, wins, players
WHERE votes.idPlayer = players.idPlayer
OR wins.idPlayer = wins.idPlayer



Voilà, là, je suis totalement bloqué. Comment faire ?

Merci d'avance pour votre aide.

1 réponse

jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
Modifié par jordane45 le 5/03/2015 à 12:30
Bonjour,

Pour "trouver" LA réponse exacte il faudrait que je puisse avoir un DUMP de ta BDD (avec quelques données dedans.) .. sinon j'ai un peu de mal ^^

Par contre, la solution s'appuiera très certainement de jointures du type LEFT JOIN / INNER JOIN ( ou OUTER JOIN)....

Un truc du genre :
--players : idPlayer, login, name, email, ip
--votes : idPlayer, month_vote, total_vote
--wins : idPlayer, month_win, total_win

SELECT P.*
       ,V.month_vote
       ,V.total_vote
       ,W.month_win
       ,W.total_win
FROM players  P
LEFT JOIN votes  V ON V.idPlayer = P.idPlayer
LEFT JOIN  wins  W ON W.idPlayer = P.idPlayer



Cordialement,
Jordane
1