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


oli004
WRInaute passionné
WRInaute passionné
 
Messages: 2173
Inscription: 5 Jan 2005

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

Message le Jeu Juil 09, 2009 16:33

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: Tout sélectionner
$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
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

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

Message le Jeu Juil 09, 2009 17:05

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: Tout sélectionner
select cours,count(*) from inscriptions group by cours


Dans ton cas ça va être nettement plus chaud, mais tu peux tenter:
Code: Tout sélectionner
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é
WRInaute passionné
 
Messages: 2173
Inscription: 5 Jan 2005

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

Message le Jeu Juil 09, 2009 20:00

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
WRInaute accro
 
Messages: 2685
Inscription: 13 Fév 2004

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

Message le Ven Juil 10, 2009 0:23

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: Tout sélectionner
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: Tout sélectionner
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: Tout sélectionner
select * from utilisateurs u join utilisateurs_cours uc on (uc.id_utilisateur=u.id) join cours on (uc.id_cours=c.id)


Jacques.


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Zecat et 1 invité