PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 07-12-2010 11:23:25

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

compter nombre d'enregistrements par catégories

Bonjour à tous!

je suis nouvellement inscrit sur ce forum car j'ai un petit souci dans une requête.

j'affiche une liste de catégories dans une page php. Chaque éléments de cette liste est un lien vers une page de détails, où l'on trouve les documents faisant partie de la catégorie choisie.

A côté de chaque catégorie, j'aimerais afficher le nombre de documents qui en font partie.

J'ai regardé du côté de la fonction Count, mais j'ai du mal à comprendre comment cela fonctionne.


Pour l'instant, j'ai la requête suivante :


mysql_select_db($database_BASE, $BASE);
$query_Recordset1 = "SELECT * FROM cat_telech ORDER BY cat_telech.titre";
$Recordset1 = mysql_query($query_Recordset1, $BASE) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);
 

et j'affiche les catégories comme ceci :


<?php do { ?>
        <p><a href="telechargement2.php?id=<?php echo $row_Recordset1['id']; ?>"><?php echo $row_Recordset1['titre']; ?></a> </p>
        <?php } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?>

Si quelqu'un a une piste, ce serait sympa !

Merci à vous de m'avoir lu ! smile

Hors ligne

#2 07-12-2010 12:04:59

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : compter nombre d'enregistrements par catégories

Pour utiliser la fonction count il faut avoir quelque chose à compter, donc il faut indiquer à la requête des regroupements.
Chose qui se fait via GROUP BY. smile

Hors ligne

#3 07-12-2010 12:45:33

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

Re : compter nombre d'enregistrements par catégories

ok merci, j'ai regardé la doc du group by, ça me donne plus d'infos pour continuer !

alors voici ma réflexion :

déjà mes tables:

les catégories sont dans la table "cat_telech", avec les champs : id, titre

les documents sont dans la table "telechargement", avec les champs : id, titre, fichier, cat (qui reprend le n° de catégorie).

il faudrait donc faire la requete suivante :

SELECT Count(*) FROM telechargement GROUP BY cat


Question : comment afficher le bon numéro à côté de chaque catégorie? avec un WHERE?

Hors ligne

#4 07-12-2010 13:36:57

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : compter nombre d'enregistrements par catégories

Voici comment on pourrait le présenter. Je n'ai pas testé la requête. smile

SELECT cat_telech.titre, COUNT(telechargement.id) AS nombre
FROM cat_telech INNER JOIN telechargement
  ON cat_telech.id = telechargement.cat
GROUP BY telechargement.cat

Hors ligne

#5 07-12-2010 14:39:21

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

Re : compter nombre d'enregistrements par catégories

Merci bcp!

je vais essayer ça et je te redis.

à la première ligne, que représente "nombre" ? c'est un champs?

Hors ligne

#6 07-12-2010 15:07:33

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

Re : compter nombre d'enregistrements par catégories

alors j'ai essayé comme ceci :

[code php]
mysql_select_db($database_perene, $perene);
$query_Recordset2 = "SELECT cat_telech.titre, COUNT(telechargement.id) AS nombre
FROM cat_telech INNER JOIN telechargement
ON cat_telech.id = telechargement.cat
GROUP BY telechargement.cat";
$Recordset2 = mysql_query($query_Recordset2, $perene) or die(mysql_error());
$row_Recordset2 = mysql_fetch_assoc($Recordset2);
$totalRows_Recordset2 = mysql_num_rows($Recordset2);[/code]

et pour l'affichage :
[code php]
<?php echo $row_Recordset2['nombre']; ?>[/code]

(j'ai essayé d'utiliser le "nombre")

résultat : ça me met "10"  à côté de chaque ligne. smile

doit y avoir un bug, héhé!

Hors ligne

#7 07-12-2010 15:14:29

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : compter nombre d'enregistrements par catégories

xTG a écrit :

Voici comment on pourrait le présenter. Je n'ai pas testé la requête. smile

SELECT cat_telech.titre, COUNT(telechargement.id) AS nombre
FROM cat_telech INNER JOIN telechargement
  ON cat_telech.id = telechargement.cat
GROUP BY telechargement.cat

Ou la !
Un GROUP BY doit se faire sur toutes les colonnes du SELECT qui ne participent pas à une fonction statistique, autrement, l'intégrité référentielle entre les colonnes n'est plus garantie.
Représentez-vous toujours les lignes d'une table comme des billes dans un sac, le SGBD, MySQL en tout cas, ne sait plus dans quel ordre ces lignes (billes) ont été insérées dans le sac (table).


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#8 07-12-2010 15:18:50

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

Re : compter nombre d'enregistrements par catégories

salut Kris,

en l'occurrence, ça veut dire quoi ?

Hors ligne

#9 07-12-2010 15:20:11

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

Re : compter nombre d'enregistrements par catégories

ha, pour le "nombre" j'ai trouvé ce que c'est :

MySQL a étendu l'utilisation de la clause GROUP BY . Vous pouvez utiliser des noms de colonnes ou des expressions qui n'apparaissent pas dans la clause GROUP BY . Elles prennent alors n'importe quelle valeur possible dans ce groupe .


C'est cela ?

Hors ligne

#10 07-12-2010 16:13:37

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : compter nombre d'enregistrements par catégories

Beuh et moi qui était content de ma requête. tongue

Dans ce cas il faudrait un GROUP BY sur cat_telech.id ?

Pour une fois que j'ai voulu faire joli en indiquant tout proprement je me suis planté... Me serais pas arrivé avant, j'aurais juste mis id et hop il se serait débrouillé. big_smile

Hors ligne

#11 07-12-2010 16:21:25

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

Re : compter nombre d'enregistrements par catégories

re xTG,

j'ai essayé avec cat_telech.id, ça donne toujours le nombre 10 à côté de chaque ligne...

Hors ligne

#12 07-12-2010 19:09:54

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : compter nombre d'enregistrements par catégories

Bon, reprenons le cahier des charges

A côté de chaque catégorie, j'aimerais afficher le nombre de documents qui en font partie.
les catégories sont dans la table "cat_telech", avec les champs : id, titre

les documents sont dans la table "telechargement", avec les champs : id, titre, fichier, cat (qui reprend le n° de catégorie).

Voilà qui devrait nous donner la requête suivante

SELECT c.id, c.titre, COUNT(*) AS nbdocs
FROM cat_telech c
LEFT JOIN telechargement t
        ON t.cat=c.id
GROUP BY c.id

Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#13 07-12-2010 21:15:40

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : compter nombre d'enregistrements par catégories

Pour ma culture personnelle j'aimerai savoir pourquoi cela ne fonctionne pas avec un inner join ? yikes
Je ne suis adepte de la syntaxe ansi que depuis peu et j'ai encore du mal à tout cerner.

Hors ligne

#14 07-12-2010 21:20:31

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : compter nombre d'enregistrements par catégories

dans ce cas, oui wink
a++

Hors ligne

#15 07-12-2010 21:27:36

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : compter nombre d'enregistrements par catégories

xTG a écrit :

Pour ma culture personnelle j'aimerai savoir pourquoi cela ne fonctionne pas avec un inner join ? yikes
Je ne suis adepte de la syntaxe ansi que depuis peu et j'ai encore du mal à tout cerner.

La différence entre nos deux requêtes est qu'avec le INNER JOIN seules apparaîtront les catégories auxquelles sont liés des documents, alors qu'avec LEFT JOIN toutes les catégories apparaîtront y compris celles auxquelles aucun document n'est lié.
Quant au problème de notre troubadour, il est probablement lié à un mauvais parcours du résultat de la requête en PHP, ou à une mauvaise exploitation de ce parcours.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#16 08-12-2010 04:05:43

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : compter nombre d'enregistrements par catégories

Petite subtilité, le COUNT(*) de ma requête risque de ne jamais retourner 0, je pense que la version COUNT(t.cat) retounera 0 et non pas 1 pour les catégories auxquelles aucun document n'est lié.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#17 08-12-2010 05:23:52

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : compter nombre d'enregistrements par catégories

troubadour a écrit :

'affiche les catégories comme ceci :


<?php do { ?>
        <p><a href="telechargement2.php?id=<?php echo $row_Recordset1['id']; ?>"><?php echo $row_Recordset1['titre']; ?></a> </p>
        <?php } while ($row_Recordset1 = mysql_fetch_assoc($Recordset1)); ?>

En alogorithmique il n'existe, fondamentalement, que deux structures de base : l'alternative et la répétitive.
L'alternative se décline sous des formes proches de

SI condition ALORS FAIRE ceci SINON FAIRE cela

La répétitive se décline quant à elle sous deux formes légèrement distinctes l'une de l'autre

TANT QUE condition FAIRE ceci

FAIRE ceci TANT QUE condition

dans la deuxième déclinaison ceci sera toujours réalisé au moins une fois avant que la condition soit testée.
Dans ton code, la condition étant que $row_Recordset1 reçoive quelque chose de mysql_fetch_assoc($Recordset1)) cela t'a obligé à initialiser $row_Recordset1 avec mysql_fetch_assoc($Recordset1)) avant d'entrer dans la structure répétitive.
L'expérience prouve que la forme TANT QUE condition FAIRE ceci est presque toujours préférable à la forme FAIRE ceci TANT QUE condition.
Je te recommande donc de ranger cette dernière au magasin des accessoires.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#18 08-12-2010 08:41:17

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

Re : compter nombre d'enregistrements par catégories

Merci beaucoup pour les explications, et le temps passé à les donner !

Je vais essayer tout ça, assimiler les connaissances, et je reviens vous dire ce qu'il en est !

Hors ligne

#19 08-12-2010 08:45:15

xTG
GrandGourou
Inscription : 18-06-2009
Messages : 1 127
Site Web

Re : compter nombre d'enregistrements par catégories

Maljuna Kris a écrit :
xTG a écrit :

Pour ma culture personnelle j'aimerai savoir pourquoi cela ne fonctionne pas avec un inner join ? yikes
Je ne suis adepte de la syntaxe ansi que depuis peu et j'ai encore du mal à tout cerner.

La différence entre nos deux requêtes est qu'avec le INNER JOIN seules apparaîtront les catégories auxquelles sont liés des documents, alors qu'avec LEFT JOIN toutes les catégories apparaîtront y compris celles auxquelles aucun document n'est lié.
Quant au problème de notre troubadour, il est probablement lié à un mauvais parcours du résultat de la requête en PHP, ou à une mauvaise exploitation de ce parcours.

Ok donc dans l'ensemble ma requête ne posait pas de problème au count() mais ne répondait pas totalement à l'énoncé.
Merci de ton explication Kris. smile

Hors ligne

#20 08-12-2010 14:37:30

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

Re : compter nombre d'enregistrements par catégories

Me voici de retour avec de mauvaises nouvelles ! big_smile

J'ai utilisé le code proposé par Kris et ça donne le même résultat qu'avant, à savoir le nombre 10 à coté de chaque ligne...

voici mon select, j 'ai peut-être fait une erreur ? :

[code php]
SELECT cat_telech.id, cat_telech.titre, COUNT(*) AS nbdocs
FROM cat_telech
LEFT JOIN telechargement
        ON telechargement.cat=cat_telech.id
GROUP BY cat_telech.id[/code]

Hors ligne

#21 08-12-2010 14:44:05

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : compter nombre d'enregistrements par catégories

Si tu lances cette requête sous PHPMyAdmin, qu'obtiens-tu ?

Au passage j'ai corrigé mon code le COUNT(*) devrait être plutôt un COUNT(t.cat).
D'autre part utilise la syntaxe avec des alias courts pour les noms de table, c'est moins pénible à relire.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#22 08-12-2010 15:07:31

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

Re : compter nombre d'enregistrements par catégories

j'ai fait le test sous phpmyadmin, et là ça fonctionne, nbdocs représente bien le nombre correct de documents par catégorie.

le problème doit donc venir de ma boucle pour l'affichage.

je vais regarder de ce côté là.

Hors ligne

#23 08-12-2010 15:09:38

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

Re : compter nombre d'enregistrements par catégories

ha ben oui, je fais pas de boucle sur le recordset 2 mais sur le 1, donc il affiche uniquement le premier résultat de la requête et ce pour chaque ligne!

je dois inclure une deuxième boucle ?

Hors ligne

#24 08-12-2010 15:42:34

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

Re : compter nombre d'enregistrements par catégories

ou alors faire une seule requête, je pense que c'est mieux, mais j'ai essayé d'ajouter dans la requête de Kris les champs t.id et t.titre et ça plante...

Hors ligne

#25 08-12-2010 16:21:13

troubadour
Membre
Inscription : 07-12-2010
Messages : 13

Re : compter nombre d'enregistrements par catégories

excusez-moi, j'ai raconté n'importe quoi ! big_smile

ça fonctionne, en faisant comme ceci :


Requête :
[code PHP]
mysql_select_db($database_base, $base);
$query_Recordset2 = "SELECT cat_telech.id, cat_telech.titre, COUNT(telechargement.cat) AS nbdocs FROM cat_telech LEFT JOIN telechargement ON telechargement.cat=cat_telech.id GROUP BY cat_telech.id";
$Recordset2 = mysql_query($query_Recordset2, $base) or die(mysql_error());
$row_Recordset2 = mysql_fetch_assoc($Recordset2);
$totalRows_Recordset2 = mysql_num_rows($Recordset2);
[/code]

Affichage :

[code PHP]
<?php
      do { ?>
        <p><a href="telechargement2.php?id=<?php echo $row_Recordset2['cat_telech.id']; ?>"><?php echo $row_Recordset2['titre']; ?></a> <?php echo $row_Recordset2['nbdocs']; ?></p>
       <?php } while ($row_Recordset2 = mysql_fetch_assoc($Recordset2)); ?>[/code]


Ouf !

bon, on peut améliorer je pense !

Merci en tout cas de votre aide !

Dernière modification par troubadour (08-12-2010 16:21:45)

Hors ligne

Pied de page des forums