Modérateur PHPfrance |
2575 Messages
15 oct. 2007, 11:31
En temps normal, t'as deux requêtes de calcul différentes car deux calculs différents.
Mais l'on peut regrouper les deux calculs dans une seule requête en utilisant ce que l'on appelle une sous-requête.
Découpant d'abord le problème en deux parties pour mieux comprendre:
1. Calcul du nombre des inscrits.
2. Calcul du nombre des attentes.
1. Calcul du nombre des inscrits:
Code : Tout sélectionner
SELECT titre, COUNT(id_insc) As inscrits
FROM inscrip_proxi JOIN acti_proxi ON inscrip_proxi.id_acti=acti_proxi.id_acti
WHERE etat = 'inscrit'
ORDER BY titre
On compte ici les id_inscrit dont l'etat='inscrit' pour éliminer ceux en attente. La table où le comptage doit se faire est "inscrip_proxi". La jointure avec la table "acti_proxi" sert simplement pour avoir le "titre" et ORDER BY pour classer le résultat par titre.
2. Calcul du nombre des attentes:
Code : Tout sélectionner
SELECT titre, COUNT(id_insc) As attentes
FROM inscrip_proxi JOIN acti_proxi ON inscrip_proxi.id_acti=acti_proxi.id_acti
WHERE etat = 'attente'
ORDER BY titre
On compte ici les id_inscrit dont l'etat='attente' pour éliminer ceux inscrits. La table où le comptage doit se faire est "inscrip_proxi". La jointure avec la table "acti_proxi" sert simplement pour avoir le "titre" et ORDER BY pour classer le résultat par titre.
Généralisation:
Pour inclure les deux requêtes 1 et 2 dans une seule. Il faut écrire une structure de sous-requêtes dans le cadre d'une requête principale qui elle doit fournire les données communes entre les requêtes 1 et 2.
En effet, on remarque que 1 et 2 sélectionnent toutes les deux le titre à partir de la table "acti_proxi"
La requête principale doit alors effectuer cette tâche une fois alors que les deux sous-requêtes doivent se spécialiser dans le comptage.
Requête principale
Requêtes spécialisées: (Changement = ne sélectionnent plus le titre)
Requête 1:
Code : Tout sélectionner
SELECT COUNT(id_insc) As inscrits
FROM inscrip_proxi
WHERE etat = 'inscrit'
Requête 2:
Code : Tout sélectionner
SELECT COUNT(id_insc) As attentes
FROM inscrip_proxi
WHERE etat = 'attente'
Maintenant, il faut faire la liaison entre la requête principale et les requêtes spécialisées de sorte que ces dernières soient utilisées par la requête principale comme des champs calculés.
Ce qui donne l'architecture de générallisation suivante:
Requête générale
Code : Tout sélectionner
SELECT titre,
(SELECT COUNT(id_insc) FROM inscrip_proxi WHERE etat = 'inscrit') As inscrits,
(SELECT COUNT(id_insc) FROM inscrip_proxi WHERE etat = 'attente') As attentes,
FROM acti_proxi
ORDER BY titre
--------
//////----
//---
//----
//////
-------
//---
//----
//---
//----
//---
//
------
//////----
//////-----
//////
-----
||--------
||--
||---
||
Prendre le recul n'est pas une perte de temps.
ps:
Affrontez moi dans l'arène