JeuWeb - Crée ton jeu par navigateur
Requête MySQL avec Join - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Requête MySQL avec Join (/showthread.php?tid=1859)

Pages : 1 2 3 4


Requête MySQL avec Join - Ludvig - 29-02-2008

Hello !

J'ai une table pour mes joueurs (player) et une table
pour des réputations (reputation).

Les tables raccourcies :

player:
id,nom,xpos,ypos,faction, ...

reputation :
playerid,reputid,valeur



Chaque joueur est membre d'une faction (et que d'une) mais il peut avoir
plusieurs réputations envers les factions existants.

Par exemple, j'ai la faction "Brigands" et la plupart des joueurs n'ont
même pas une entrée dans la table reputation pour cette réputation,
d'autres en ont mais leur réputation est très faible et
encore d'autres ont une réputation élevé.


Le problèmes est que je n'arrive pas a sélectionner des joueurs qui
n'a pas de réputation dans un faction...


Je voudrait pouvoir sélectionner les joueurs ayant une réputation faible
(disons <100) ou qui na pas de réputation du tout, comment faire ?

Si je fais un LEFT JOIN je vais être embetté quand le joueur n'a pas
d'entrée dans la table reputation...



Merci pour tout aide !

/Ludvig


RE: Requète MySQL avec join - Anthor - 29-02-2008

C'est quand même de but du LEFT JOIN que de sortir les lignes jointes mêmes si elles n'existent pas...
Du coup tu peux sélectionner uniquement les lignes où reputid est NULL


RE: Requète MySQL avec join - Ziliev - 29-02-2008

Un select count() ? Sans t'écrire un truc à la syntaxe exacte (j'ai un peu du mal avec MYSQL donc je suis toujours obligé de tester 50 fois avant que ca marche Tongue), un truc de ce style peut p'tet marcher:

SELECT * FROM player WHERE ( (SELECT COUNT(*) FROM reputation WHERE reputation.playerid = player.id) = 0 ) OR (player.id = reputation.playerid AND reputation.valeur <100) )

'fin une table juste pour ces 3 valeurs je vois pas bien l'intéret, pourquoi t'as pas ajouté directement la réputation dans la table player ? Quite à découper ta colonne si t'as plusieurs valeurs pour plusieurs factions (genre "brigands;gentils;méchants") ou même faire une colonne par faction.


RE: Requète MySQL avec join - rachids - 29-02-2008

Hum voila ce que j'aurais fais mwa :

Code :
SELECT P.id
FROM player P, reputation R
WHERE P.id = R.playerid
AND R.valeur IS NULL (ou R.valeur = 0)
GROUP BY P.faction;

(pas sûr que ça fonctionne j'ai fais ça de tête vite fais)


RE: Requète MySQL avec join - Ludvig - 29-02-2008

Ah oui ça a l'air parfait Salty (faut juste que ça marche aussi :haha: ) !

Merci pour tout les réponses, je reviens des que j'ai eu le temps de tester !


/Lud


RE: Requète MySQL avec join - rachids - 29-02-2008

Pas de quoi, tu me diras si ça a fonctionné Wink

Perso, en cours j'ai jamais vu (ou ptête pas encore vu) les trucs de Left Join etc.., j'ai déjà maté ça sur le net et je me suis rendu compte que c'était un peu se compliqué la vie pour rien puisque moi les jointures je les fais sans "Left/Right Join" quelque chose ^^
Après j'ai pas encore tout vu en SQL donc j'peux pas dire :x


RE: Requète MySQL avec join - Anthor - 29-02-2008

C'est pourtant bien mieux, ce n'est pas parce que tu ne l'as pas vu que c'est plus compliqué...
De plus c'est faux, un SELECT sur plusieurs tables se comporte comme un INNER JOIN, donc ne lui sortira que les joueurs disposant d'une réputation, hors, il cherche les joueurs n'ayant pas de réputation.

Code PHP :
<?php 
SELECT p
.id
FROM player
AS p
LEFT JOIN reputation
AS r
ON p
.id = r.playerid
WHERE r
.valeur = NULL OR r.valeur < 100

Bien sûr, sans avoir la structure exacte de tes tables, avec un peu de contenu, la requête peut légèrement changer.


RE: Requète MySQL avec join - Ludvig - 02-03-2008

Holà ça ne marche pô Sad

Le problème c'est que quand il n'y a pas d'entrée dans la table réputation
qui corresponds au id du player ça ne comptabilise rien...


Je vais essayer d'illustrer un peu mieux :

Disons que j'ai trois joueurs dans la table player
A (player.id=100)
B (player.id=200)
C (player.id=300)

Valeurs dans la table reputation : (reputation.id=1 -> la réputation vis à vis des Contrebandiers du sud).

reputation.id=1, playerid=100, value=10 //<- 10 == en guerre
reputation.id=1, value=200, value=500 //<- 500= en paix

A est en guerre avec les Contrebandiers (réputation <100)
B = en paix avec les Contrebandiers (réputation >=100)
C est en guerre avec les Contrebandiers (car il n'a même pas d'entrée dans la table réputation ce qui vaut un zero)


Ce que je cherche est alors de récupérer A et C sans pour autant avoir besoin
d'insérer une autre valeur dans la table réputation pour joueur "C".


Es possible ?

/Ludvig


RE: Requète MySQL avec join - Anthor - 02-03-2008

Avec la requête que je t'ai donné, oui.
C aura NULL en value


RE: Requète MySQL avec join - rachids - 02-03-2008

Anthor a écrit :
Code PHP :
<?php 
SELECT p
.id
FROM player
AS p
LEFT JOIN reputation
AS r
ON p
.id = r.playerid
WHERE r
.valeur = NULL OR r.valeur < 100

Salut Anthor,

J'aimerais que tu m'expliques en quoi cette requête est différente de celle ci :

Code PHP :
<?php 
SELECT p
.id
FROM player p
, reputation r
WHERE p
.id = r.playerid
AND (r.valeur = NULL OR r.valeur < 100);

Je pense que cela donnera le même résultat. Non ?
Merci de m'éclairer un peu ^^