JeuWeb - Crée ton jeu par navigateur
Comment faire une jointure avec plusieurs entrées ? - 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 : Comment faire une jointure avec plusieurs entrées ? (/showthread.php?tid=2683)

Pages : 1 2 3


Comment faire une jointure avec plusieurs entrées ? - Arathor - 14-06-2008

Bonjour,
J'ai récemment mis au point ma base de donnée (cf ce topic) et j'ai une petite question. Dans ma table colonie, j'ai l'ID de la colonie, de même, dans ma table colonie_ressources je retrouve ce champ, et j'ai ainsi une entrée pour chaque ressource présente sur ma colonie (puisque une autre table (ressource) possède un ID pour chaque ressource et ma table colonie_ressources contient uniquement l'ID de la colonie, l'ID de la ressource et le nombre)...
Enfin bref, en gros j'ai une table avec un ID, et une autre table avec plusieurs entrée pour ce même ID, et j'aimerais pouvoir, en utilisant les jointures, selectionner tout ça dans une seule variable, ou plus précisément dans un seul array, car jusqu'ici je n' ai réussi à obtenir qu'un array dans lequel j'avais les données de ma première table avec seulement la première entrée de ma seconde table (je pense que c'est plus clair comme ça). Comment puis-je faire ceci ? il doit bien exister une fonction spéciale mais je ne l'ai pas trouver...


RE: Comment faire une jointure avec plusieurs entrée ? - Jon04 - 15-06-2008

Slt,

tu devrais trouver ton bonheur ici: Jointure mysql


RE: Comment faire une jointure avec plusieurs entrée ? - Arathor - 15-06-2008

J'ai peut être mal lu, mais il me semble que ça ne parle que de jointures par colonnes. Dans mon cas je souhaite joindre une ligne d'une table avec plusieurs lignes d'une autre table...


RE: Comment faire une jointure avec plusieurs entrées ? - Ruz - 15-06-2008

donne un exemple avec les champs des tables qui t'intéresse, et le lien entre les ID, on va te l'expliquer sur du concret, la jointure ^^


RE: Comment faire une jointure avec plusieurs entrées ? - Shakkah - 15-06-2008

Je ferais la requete comme cela pour ma part

Code :
SELECT Ce que ta besoin
FROM colonie
JOIN ressource ON colonie.ID = ressource.idColonie

Puis pour récup tes résultats un classique

Code PHP :
<?php 
while(mysql_fetch_array(du result de la requete))
{
Le code pour gérer les ressources
}



RE: Comment faire une jointure avec plusieurs entrées ? - Eluox - 15-06-2008

Il manque un JOIN pour colonie_ressource non ?

C'est vraii que sa serait pas mal d'avoir la constitution de ta BDD, pour nous aider


RE: Comment faire une jointure avec plusieurs entrées ? - Ruz - 15-06-2008

je me trompe peut-etre, mais une colonie sans ressource va faire planter ta requete, non?

Perso, j'dirais un truc du genre:

SELECT r.ID, r.nom, r.cat, cr.quantité
FROM colonie c
LEFT JOIN colonie_ressource cr ON c. ID=cr.ID_colonie
LEFT JOIN ressource r ON cr.ID_ressource=r.ID
WHERE c.ID=$variable_ID_colonie$
ORDER BY r.cat, r.nom ASC

bon, maintenant, j'ai tjs pas ta structure, donc ^^


RE: Comment faire une jointure avec plusieurs entrées ? - Arathor - 15-06-2008

Alors voici ma structure :

[Image: tablesq0.png]

J'ai donc une table colonie, une table ressources, et une table colonie_ressources qui fait le lien entre les deux.
Je souhaiterais obtenir quelque chose comma ça :
[Image: resultateq6.png]

Le problème, c'est que je n'arrive pas à joindre les 3 entrées de ma table colonie_ressources à ma table colonie, au mieux je parviens à en joindre une seule (la première)... ou alors, j'ai 3 arrays : dans le premier j'ai ma table colonie puis la 1è ressource de ma table colonie_ressources, dans le second toujours ma table colonie avec cette fois la seconde ressource de colonie_ressources et etc...
J'ai essayer les requêtes que vous m'avez proposer et j'ai aussi chercher de mon coter mais sans résultat...


RE: Comment faire une jointure avec plusieurs entrées ? - Shakkah - 15-06-2008

@Ruz: effectivement s'est bien possible que ça fasse planté ^_^, je suis pas trop doué avec les left et right join ^_^

Alors, la requete doit etre ce style là :
Code :
SELECT * //Pas bien mais bon tu veux tous à priori ^_^
FROM colonie
LEFT JOIN colonie_ressources
ON colonie.ID_colonie = colonie_ressources.ID_colonie
WHERE colonie.ID_joueur = 9 // Pour avoir que les données du joueur 9
Par contre cette méthode te retournera 3 ligne une par ressource.
Je réfléchi pour voir si c'ets tehcniquement possible de retourner plusieurs ligne d'une table en une ligne
Si ça marche pas une tel requête te retourne quoi ?

EDIT: je viens de relire ton message donc ne tiens pas compte de ce que j'ai dis, c'est ce que tu dois déjà faire.
Je regarde de mon coté si ce que tu veux faire est possible.


RE: Comment faire une jointure avec plusieurs entrées ? - Ruz - 15-06-2008

oublie...
Je ne pense pas que tu puisses sortir TOUT en une seule ligne... (d'ailleurs: quel intéret??? comment traiterais-tu les champs? (longueur variable))

tu sortiras les résultats par "unité", soit, ici, par ressource.

au mieux, tu peux sortir:
ID_joueur / ID_colonie (que j'appellerais ID dans la table colonie) / Nom_colonie / ID_ressource / Nombre
bref:
9 / 1 / Ma colonie / 1 / 50
9 / 1 / Ma colonie / 3 / 35
9 / 1 / Ma colonie / 2 / 20

3 lignes d'office ^^
m'enfin, a la réception, c'est pas plus compliqué à traiter, hein ^^ (meme plus simple: comment traiterais-tu ta réponse recherchée???)
allez, pour le fun, l'exmple par le code:
Code PHP :
<?php 
$req
='SELECT c.ID as ID_c, c.nom as colonie, cr.nombre, r.ID as ID, r.nom
FROM colonie c
LEFT JOIN colonie_ressources cr ON c. ID=cr.ID_colonie
LEFT JOIN ressources r ON cr.ID_ressource=r.ID
WHERE c.ID_joueur='
.$_SESSION["ID_joueur"].'
ORDER BY r.nom ASC'
;
$res=mysql_query($req) or die ('pas bien');
if(
mysql_num_rows($res)>0){
$ressource= array();
while(
$d=mysql_fetch_assoc($resultat))
{
$ressource[]=array("ID" => $d["ID_ressource"], "nom"=>$d["nom"], "Qtt"=>$d["Nombre"]);
}

//et à l'affichage/traitement...

foreach($ressource as $k=>$d)
{
echo
'<br />'.$d["nom"].' : '.$d["Qtt"];
}
}
(PS: tu m'excuseras, mais l'ID d'une table, je l'appelle tjs ID... je ne met un qualificatif que si c'est une référence externe)
PS2: code explicatif, pas testé du tout
PS3: je me relis, alors, je recommente ^^
Bref: il est possible de relire le nom des champs retourné, je pense... je connais pas la fonction, mais je pense que c'est possible... DOnc, ton idée pourrait *théoriquement* etre traitée...