requête simple ou multiple ?

Eléphant du PHP | 57 Messages

23 avr. 2006, 09:36

Je bute sur la composition d’une requête MySQL…

Imaginons 2 tables :

tbl_team :
- id_team
- id_1
- id_2
- id_3
- etc…

tbl_joueur :
- id_joueur
- prenom_joueur
- nom_joueur


ex :
tbl_team :
- team1 / 600 / 100 / 50 / 200 / 1000 / 750
- team37 / 550 / 99 / 45 / etc.

tbl_joueur :
- 600 / Pedro / Lalumiere
- 100 / Paula / Bonita
- 50 / Roger / Rabit
- etc…


Je souhaiterais construire une requête qui me donne les résultats suivants (c'est-à-dire que les numéros d'identification des joueurs sont remplacés par leurs prénoms et noms) :

- team1 / Pedro / Lalumiere / Paula / Bonita / Roger / Rabit/ etc.

- team37 / prenomX / nomX / prenomY / nomY / etc.

Y a-t-il un moyen de faire le tout en une seule requête ou bien faut-il jongler avec de multiples requêtes (en l’occurrence dans la table tbl_team, j’ai l’id de l’équipe + 12 colonnes) ?

Merci d'avance, car je n'ai rien trouvé jusqu'ici sur le sujet.

Eléphant du PHP | 377 Messages

23 avr. 2006, 12:17

A ta place je partirais complètement dans l'autre sens:
je m'explique:
Imaginons 2 tables :

tbl_team :
- id_team
- id_1
- id_2
- id_3
- etc…

tbl_joueur :
- id_joueur
- prenom_joueur
- nom_joueur
Je ferais plutot :

Code : Tout sélectionner

tbl_team: - id_team - nom_team tbl_joueur: - id_joueur - nom_joueur - prenom_joueur - id_team
à partir de là, en faisant
$requete=mysql_query("SELECT * FROM tbl_joueur AS j LEFT JOIN tbl_team AS t ON j.id_team=t.id_team ORDER BY id_team");
$team_en_cours="";
while($r=mysql_fetch_array($requete)) {
   if($r[nom_team]!=$team_en_cours) {
      if($team_en_cours!="") {
         echo "</ul>";
      }
      $team_en_cours=$r[nom_team];
      echo $r[nom_team]."<ul>";
   }
   echo "<li>".$r[nom_joueur]." ".$r[prenom_joueur]."</li>";
}
voilà, j'ai pas testé mais ça devrait pas etre trop mal ;)
Petit scarabée deviendra grand

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

23 avr. 2006, 12:19

Salut,

Proposition:

Code : Tout sélectionner

SELECT t1.id_team, t2.prenom_joueur, t2.nom_joueur FROM tbl_team t1, tbl_joueur t2 WHERE t1.id_1 = t2.id_joueur OR t1.id_2 = t2.id_joueur
...

Code : Tout sélectionner

SELECT t1.id, t2.prenom_joueur, t2.nom_joueur FROM tbl_team t1 JOIN tbl_joueur t2 ON t1.id_1 = t2.id_joueur OR t1.id_2 = t2.id_joueur ...
Mais tu vas avoir des requetes à rallonge :?

tu ne devrais pas avoir tant de champs id_1, id_2, ... dans la table "tbl_team".
Une structure de ce genre plustôt:

Code : Tout sélectionner

tbl_team id id_team id_joueur
ensuite une entrée pour chaque joueur avec l'id_team auquel il appartient.

Code : Tout sélectionner

tbl_team : 1 team_1 600 2 team_1 100 3 team_1 50 4 team_1 200 5 team_1 1000 6 team_1 750 7 team_37 550 8 team_37 99
Et la requete serait simlifiée, du genre:

Code : Tout sélectionner

SELECT t1.id_team, t2.prenom_joueur, t2.nom_joueur FROM tbl_team t1 JOIN tbl_joueur t2 ON t1.id_joueur = t2.id_joueur

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 57 Messages

23 avr. 2006, 20:17

Merci pour vos explications.

A vrai dire, la structure présentée a omis un point important...

tbl_team :
- id_team
- id_1
- id_2
- id_3
- etc…

A savoir que l'ordre des id_1, id_2, id_3, id_4 avait une importance certaine. En l'occurence :
- col 2 : id_1 est le boss,
- col 3 : id_2 est l'adjoint,
- col 4 et suivantes : id_3 -> id_12 sont de membres avec des prérogatives différentes.

Je cherchais le résultat d'une requête qui m'aurais sorti une ligne par équipe, avec : prenom_id_1, nom_id_1, prenom_id_2, nom_id_2, prenom_id_3, nom_id_3. Pour l'instant, j'obtient plusieurs ligne par équipe et je ne sais plus de quelle colonne provient les noms/prénoms.

Comme c'est parti, j'ai l'impression qu'il va falloir faire quelques jongleries entre les requêtes SQL... A moins qu'il y ait une expression élégante pour sortir ce tableau où l'on remplace des numéros d'identités (14 num_id = 14 colonnes) par un couple nom / prénom (14 x 2 colonnes = 28 colonnes + une première colonne avec le nom de l'équipe). En effet, si la requête se construit ainsi, je peux retrouver facilement la nature des différents membres de l'équipe (3 rôles différents) en fonction de la position dans le tableau (numéro de la colonne).

De mon côté, je vais continuer à méditer sur ce sujet. Si vous avez une autre idée, merci d'avance.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

23 avr. 2006, 23:29

non non, j'ai rien compris à tes calcul mathématiques et tout le tralala de prestigiditateur :lol:

Tu as omis ce détail de grade mais ça n'as pas d'importance directe.

Tu dois ajouter un champ pour le grade à la table des joueurs, tu auras donc:

Code : Tout sélectionner

tbl_team: - id_team - nom_team tbl_joueur: - id_joueur - nom_joueur - prenom_joueur - id_team - grade (en type enum avec ("boss","adjoint","membres ")
ensuite tu n'auras pas exactement l'affichage que tu souhaites mais fauras le construire en programmant après.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 57 Messages

24 avr. 2006, 20:47

ensuite tu n'auras pas exactement l'affichage que tu souhaites mais fauras le construire en programmant après.
Oui effectivement... Donc il n'y a pas de raccourcis !

Encore merci d'avoir éclairé ma lanterne !

:)