[PHP/MySQL] Recouper des données entre 2 tables - Une meilleure façon de faire ?

Bonsoir,

Je fais un script pour lister les joueurs d’une équipe.
J’ai une table players, avec un champ ‘nom’ et un champ ‘id_team’.
J’ai une seconde table teams, avec un champ ‘id’.

Mon script ci-dessous fonctionne mais je suis sûr qu’il existe une meilleure méthode pour arriver au même résultat, car ça me fait quand même 8 requêtes sur la même table…


mysql_connect("$host", "$login", "$pass") or die('Impossible de se connecter à la base de données');
mysql_select_db("$bdd") or die('Impossible de se connecter à la base de données');

$requete_teams = mysql_query('SELECT id, nom FROM teams ORDER BY id');

while ($donnees_teams = mysql_fetch_array($requete_teams) )
{

$requete_players = mysql_query('SELECT id, nom, id_team FROM players ORDER BY id');
echo 'Équipe ' . $donnees_teams['id'] . ' : ';

	while ($donnees_players = mysql_fetch_array($requete_players) )
	{
  if ($donnees_players['id_team'] == $donnees_teams['id'] )
  {
  	echo $donnees_players['nom'] . ' ';
  }
	}

  echo '<br />';
}

mysql_close();

J’ai testé avec foreach, mais ça ne semble pas correspondre à mon cas.
Je sais qu’il serait possible d’ajouter le nom des joueurs dans la table teams, mais j’aimerais résoudre mon “problème” car je pense que j’en aurais surêment besoin…

Je vous écoute Messieurs, et merci d’avance :jap:

Commence déjà par virer ça :

mysql_connect("$host", "$login", "$pass") or die('Impossible de se connecter à la base de données');
mysql_select_db("$bdd") or die('Impossible de se connecter à la base de données');

Si $host, $login, $pass, $bdd doivent être des chaînes, PHP les verra comme telles le moment voulu. Ca sert à rien (et c’est du temps perdu, puisque tu semble être vouloir optimisé ton script) de les mettre entre double quote.

Pour le reste : apprend un peu le SQL, et notamment (au choix) :

  1. les jointures : en gros, tu prend la première table que tu joins avec la seconde selon tes besoins. Exemple adapté à ton cas :
SQL
[color=blue;font-weight:bold]SELECT[/color] T.id AS team_id, T.nom AS team_name, P.id AS player_id, P.nom AS player_name

FROM teams T
INNER JOIN players P ON P.id_team = T.id
ORDER BY team_id, player_id

Test dans phpmyadmin (la requête est bonne normalement). Tu devrais voir pour chaque équipe les joueurs associés.

  1. utilise WHERE simplement?
$requete_players = mysql_query('SELECT id, nom, id_team FROM players WHERE id_team = $donnees_teams['id'] . ' ORDER BY id');
echo 'Équipe ' . $donnees_teams['id'] . ' : ';

while ($donnees_players = mysql_fetch_array($requete_players) )
{
  echo $donnees_players['nom'] . ' ';
}

(code de la boucle principale)

Au choix donc.

Thanks l’ami !

Je viens de fini mon script en y ajoutant tes 2 nouvelles méthodes, avec un ptit bench

Résultat :

INNER JOIN : 1 requete en 0.01 s
SELECT avec WHERE : 9 requetes en 0.04 s
SELECT sans WHERE : 9 requetes en 0.03 s

Le where ralentit donc la chose, ce qui est normal, mais mon choix est fait !
Merci beaucoup ‘Sans-Nom’ ! :jap:

Non mais le WHERE c’est la bonne façon de faire hein.

Tu vas pas supplanter le SGBD non plus…

Oui mais ça rajoute un argument alors c’est un peu plus long à traiter, même si au final ça fait moins de données :whistle:

Hé, j’tai dit merci hein, te faches pas ! :stuck_out_tongue:

? Tu fais la même chose, c’est tout.

Sauf que si tu utilises un autre SGBD, tu peux avoir le cas où c’est plus performant avec WHERE. De plus, rends toi compte qu’à chaque itération tu prend tous les éléments. Quand tu peux restreindre, vas y.

Surtout que si ta table est bien indexée, ça peut être carrément plus rapide…

Oui, tu as raison, excuse :stuck_out_tongue:

En tous cas merci bien !