Page 1 sur 1

Calcul du total de plusieurs catégories.

Posté : 17 juin 2006, 02:30
par dvly
Bonjour,

Voilà, j'ai réalisé une sorte d'annuaire de liens, classé par catégorie dans une base de donnée (id, titre, url, cat_1 = 1, cat_2 =0), etc... (un site peut appartenir à plusieurs catégories).

J'aimerai que lorsqu'un utilisateur affiche les différentes catégories, que ça affiche entre parenthèses le nombre de sites disponibles dans cette catégorie

ex : cat_1 (120) - cat_2 (63) - etc...

Pour arriver à ce résultat j'utilise cette requête :

$sql = "SELECT COUNT(*) AS totalcat FROM `annu` WHERE `status` = 1 $catopt";

Où $catopt = "AND `cat_1` = 1"; (etc...)

ce qui donne :

$sql = "SELECT COUNT(*) AS totalcat FROM `annu` WHERE `status` = 1 AND `cat_1` = 1";

Ma question est la suivante :

J'ai environ 20 catégories différentes, et il me parait un peu lourd de faire une requête pour chacune d'entre elles, tant au niveau du code, que du nombre de requête à effectuer.
Y'a t'il une autre solution ? (concatenation de la requête SQL par exemple)
Ou bien, est ce que finalement, ça n'utilise pas tant de ressources que ça ??

Merci d'avance !!

Posté : 17 juin 2006, 11:03
par jpaul
Comme personne ne répond, je me lance bien que puet compétant en MySql : il me semble que c'est grouped by qui permet ça.
Tu peux regarder là : http://dev.mysql.com/doc/refman/5.0/fr/ ... -rows.html
Si tu n'as pas trouvé avec cette piste, je regarderai tout à l'heure quand j'aurai un peu plus de temps...

Posté : 17 juin 2006, 13:20
par Invité
Merci pour cette piste, je vais aller jeter un coup d'oeil.

Posté : 17 juin 2006, 14:28
par Invité
J'ai bien que cette solution ne me convienne pas :/
En fait j'aimerai calculer le total de chaque collones (catégorie) où cette catégorie vaut 1 (et pas 0)

Donc pour une catégorie, j'y arrive très bien en utilisant SELECT COUNT(*) AS `total` from `annu` WHERE `cat_1` = 1;
Il faudrait en fait que j'arrive à récuperer une valeur sous forme de tableau, ou à défaut, plusieurs valeurs comme par ex totalcat1, totalcat2, etc...
Mais en une seule requête.

Si quelqu'un a une idée..

merci

Posté : 17 juin 2006, 14:45
par Ben-J
peut être simplement dans une boucle for où i serait la variable de condition? tu réexecuterai la requête incluse dans la boucle suivant i. 'fin bon ce que j'en dis, je débute...

Posté : 17 juin 2006, 14:48
par Invité
héhé merci pour ton astuce Ben-J mais c'est évidement la premiere chose à laquelle j'ai pensé.
Simplement, il me semble lourd et contraignant d'utiliser cette méthode.
Et au vue du nombre des catégorie que j'ai... (environ une 20 aine) ça me parait un peu beaucoup.
C'est pour cette raison qe j'essaie d'envisager une solution n'utilisant qu'une seul requête, pour éviter tout allourdissement.

merci quand même.

Posté : 17 juin 2006, 14:53
par Ben-J
lol c'est bien ce que je pensai ^^ en même temps je ne pense pas qu'il existe 36 solutions... a ta place je me serai lancé quand même pour ne pas rester bloqué, quitte a reprendre ton code lorque tu(ou qqun) aura trouvé une autre méthode... @++

Re: Calcul du total de plusieurs catégories.

Posté : 17 juin 2006, 14:53
par Truc
Salut,

Chose très importante et pourtant tu le précise entre parenthèses
(un site peut appartenir à plusieurs catégories)
Ce qui me faire dire que tu as un défaut de conception de la base de donnée.

Lorsqu'un élément peut faire partie de plusieurs catégories et que les catégories peuvent contenir plusieurs éléments on construit une table suplémentaire (intermédiaire).
Au final tu devrais avoir 3 tables:

Code : Tout sélectionner

table annuaire id_annuaire nom_annuaire lien_annuaire table annu_cat (table intermédiaire) id_inter id_annuaire id_categorie table categorie id_cat nom_cat
La table catégorie est fixe tu la remplis une fois avec les différentes catégories disponibles.

Lors d'un ajout d'un nouveau lien dans la table annuaire tu relèves l'id qui vient d'être crée (automatiquement) avec mysql_insert_id() puis tu crée un enregistrement dans la table intermédiaire avec l'id précédemment relevé et l'id de la catégorie correspondante. Si un lien appartient à plusieurs catégories tu ajoute autant d'enregistrements dans la table "annu_cat" que de nécéssaire en changeant seulement l'id de la catégorie.

Puis tu devrais plus facilement arriver a ce que tu voudrait avec une raquete du style:

Code : Tout sélectionner

SELECT COUNT(*) as nb , nom_annuaire,lien_annuaire,nom_cat FROM annuaire a LEFT JOIN annu_cat ac ON a.id_annuaire = ac.id_annuaire LEFT JOIN categorie c ON a.id_categorie = c.id_categorie GROUP BY ac.id_categorie
"annuaire a" => Ici "a" est un alias qui renome la table (le temps de l'exécution) pour faciliter la lecture de la requête.

Posté : 17 juin 2006, 16:21
par Invité
Merci pour ce conseil judicieux, il est vrai qu'étant assez autoditacte, je n'ai pas toujours les bonnes méthodes structurales, si d'ailleurs, quelqu'un avait un site ou autre, sur les façons d'organiser son travail, et de se structurer, je l'accueillerai bien volontiers :)

merci !

Posté : 17 juin 2006, 17:22
par Truc
Dans le forum adapté (Base de données) :arrow: http://www.phpfrance.com/forums/voir_sujet-12038.php