Vous n'êtes pas identifié(e).
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 :
et j'affiche les catégories comme ceci :
Si quelqu'un a une piste, ce serait sympa !
Merci à vous de m'avoir lu !
Hors ligne
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
Voici comment on pourrait le présenter. Je n'ai pas testé la requête.
Hors ligne
Merci bcp!
je vais essayer ça et je te redis.
à la première ligne, que représente "nombre" ? c'est un champs?
Hors ligne
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.
doit y avoir un bug, héhé!
Hors ligne
Voici comment on pourrait le présenter. Je n'ai pas testé la requête.
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
salut Kris,
en l'occurrence, ça veut dire quoi ?
Hors ligne
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
Beuh et moi qui était content de ma requête.
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é.
Hors ligne
re xTG,
j'ai essayé avec cat_telech.id, ça donne toujours le nombre 10 à côté de chaque ligne...
Hors ligne
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, titreles 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
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
Pour ma culture personnelle j'aimerai savoir pourquoi cela ne fonctionne pas avec un inner join ?
Je ne suis adepte de la syntaxe ansi que depuis peu et j'ai encore du mal à tout cerner.
Hors ligne
dans ce cas, oui
a++
Hors ligne
Pour ma culture personnelle j'aimerai savoir pourquoi cela ne fonctionne pas avec un inner join ?
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
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
'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
La répétitive se décline quant à elle sous deux formes légèrement distinctes l'une de l'autre
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
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
xTG a écrit :Pour ma culture personnelle j'aimerai savoir pourquoi cela ne fonctionne pas avec un inner join ?
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.
Hors ligne
Me voici de retour avec de mauvaises nouvelles !
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
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
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
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
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
excusez-moi, j'ai raconté n'importe quoi !
ç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