[PHP/MYSQL] Besoin d'aide pour la simplification d'une requete

oli004

WRInaute passionné
Bonjour tout le monde,

Je veux compter le nombre de participant par cours avec toutes les données en bdd bien sur. Actuellement, une solution qui fonctionne mais qui me semble bien lourde :
Code:
$result_latin_deb = mysql_query("SELECT * FROM inscriptions WHERE latin_deb = '1'", $db);
$num_rows_latin_deb = mysql_num_rows($result_latin_deb);

$result_latin_pra = mysql_query("SELECT * FROM inscriptions WHERE latin_pra = '1'", $db);
$num_rows_latin_pra = mysql_num_rows($result_latin_pra);

...

idem pour 10 disciplines

puis :

echo "<b>".$num_rows_latin_deb."</b> pratiquent les <b>danses latines débutant</b><br />";
echo "<b>".$num_rows_latin_pra."</b> pratiquent les <b>danses latines pratiquant</b><br />";
...
J'imagine qu'il y a moyen de placer tout ça en une seule requete et dans un array, mais je n'y suis pas familler, donc je requiere un petit coup de main :wink:
 

jcaron

WRInaute accro
Ben si les critères sont des colonnes différentes à chaque fois ça ne va pas être tip top.

Idéalement, tu devrais avoir une seule colonne qui indique le cours, et dans ce cas tu peux faire:
Code:
select cours,count(*) from inscriptions group by cours

Dans ton cas ça va être nettement plus chaud, mais tu peux tenter:
Code:
select case when latin_deb=1 then 'latin_deb' when latin_pra=1 then 'latin_pra' ... end as cours,count(*) from inscriptions group by 1

Tu obtients évidemment dans les deux cas un tableau avec une ligne par cours, le nom du cours en première colonne et le nombre d'inscrits dans la deuxième.

Jacques.
 

oli004

WRInaute passionné
Merci pour ta proposition jcaron, mais je pense que je vais rester avec la solution actuelle. Il y a en effet une colone par cours avec 1 si pratiqué et 0 si non pratiqué. C'était une question de choix dès le départ. Ca fonctionne ainsi, c'est déja ça.
Merci tout de même.
 

jcaron

WRInaute accro
L'inconvénient de ta solution, c'est qu'à chaque cours ajouté tu vas devoir ajouter une colonne et modifier ton code, c'est pas top pratique. Et évidemment ça complique toutes sortes de rapports comme tu t'en rends compte.

L'autre solution judicieuse (plus si dans ta table originale il s'agit d'une ligne par utilisateur, et que chaque utilisateur peut suivre plusieurs cours) est d'avoir une table pour les utilisateurs, une table pour les cours, et une table de "jointure" (qui contient une colonne pour l'utilisateur et une pour le cours).

Genre:
- table utilisateurs: id, nom, etc.
- table cours: id, nom, etc.
- table utilisateur_cours: id_utilisateur, id_cours

Tu peux alors obtenir ce que tu veux en faisant un:
Code:
select id_cours,count(*) from utilisateur_cours group by id_cours

Et pour obtenir le détail de tous les cours de chaque utilisateur:
Code:
select * from utilisateurs u,cours c,utilisateurs_cours uc where u.id=uc.id_utilisateur and c.id=uc.id_cours

Ou pour les excités du join explicite:
Code:
select * from utilisateurs u join utilisateurs_cours uc on (uc.id_utilisateur=u.id) join cours on (uc.id_cours=c.id)

Jacques.
 

Discussions similaires

Haut