Fonction GROUP BY

Résolu/Fermé
Delphine97224 Messages postés 99 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 - 27 sept. 2009 à 09:58
Delphine97224 Messages postés 99 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 - 8 oct. 2009 à 22:45
Bonjour,

J'ai une base de données Mysql dans laquelle j'ai créé des menu, sous menu et des produits. Je souhaiterais afficher les produits par sous-menu. J'ai utilisé la fonction Group By mais il me manque une ligne de code pour que ça m'affiche tous les produits et pas qu'un seul produit par sous-menu. Je vous mets mon code et j'aimerais que vous m'aidiez.

Merci par avance ;)




<?php
$style = 1;
$reponse = mysql_query("SELECT * FROM fiches_categorie WHERE menu='Alimentaire' GROUP BY sous_menu ORDER BY sous_menu");
while ($donnees = mysql_fetch_array($reponse))
{
echo '<div class=\"groupe" .($style%3) ."\">';
$style++
?>
<h2><?php echo $donnees['sous_menu']; ?></h2>
<h3><?php echo '<a href="fiche-par-type.php?id_fiche=' .$donnees['id'] . '">' . $donnees['produit'] . '</a>'; ?>
</h3>
<?php
}
?>
A voir également:

6 réponses

Delphine 97224 (quel nom poétique !)

Ta requête initiale est presque ok, mais tu es parti sur la piste group by qui n'est pas adaptée dans ce cas :
Ce que tu veux, c'est afficher TOUS les enregistrements, en faisant des ruptures à l'affichage.
La clause (et pas la fonction) GROUP BY ne donne pas le détail des éléments, elle les regroupe, ce n'est donc pas la bonne piste dans ton cas.

Ma proposition :
Le SQL va ramener tous les éléments concernés ordonnés par sous menu :
Fait une requête SQL simple, avec juste un order by des éléments sur lesquel il doit y avoir rupture
exemple :
SELECT menu, sous_menu, description, prix, etc... FROM fiches_categorie ORDER BY  sous_menu
WHERE menu like 'Alimentaire' 


C'est le PHP va se charger de faire les ruptures comme ci-dessous :
<?php
$style = 1;
$reponse = mysql_query("SELECT * FROM fiches_categorie WHERE menu like 'Alimentaire' ORDER BY sous_menu");

$dernierSousMenu = ""; // initialise la valeur pour les ruptures
$sousmenucourant = "";

while ($donnees = mysql_fetch_array($reponse))
{
  $sousmenucourant = $donnees['sous_menu'];
  if ($sousmenucourant != $dernierSousMenu)
  {
    //echo '<div class=\"groupe" .($style%3) ."\">'; commente par manque du code css necessaire
    $style++;
    echo "<h2>" . $sousmenucourant . "</h2>\n"; // note le backslash n est juste mis pour un code généré plus joli (idem ci-dessous)
    $dernierSousMenu = $sousmenucourant;
  }
  echo "<h3><a href=\"fiche-par-type.php?id_fiche=" .$donnees['id'] . "\">" . $donnees['produit'] . "</a>";
  echo "</h3>\n";
}
?>

En espérant que cela te serves, et fais attention au mélange html/PHP : si tu ne veux pas être perdue, fais comme j'ai fait dans l 'exemple : Dans un cas comme celui-ci, il vaut mieux : tout en php.
Une remarque aussi, évite de multiplierles mélanges de simple qotes et doubles quotes !
En cadeaux, un exemple de code html généré :
<h2>Boissons</h2>
<h3><a href="fiche-par-type.php?id_fiche=1">coca</a></h3>
<h3><a href="fiche-par-type.php?id_fiche=2">limonade</a></h3>
<h3><a href="fiche-par-type.php?id_fiche=3">bière</a></h3>
<h2>Entrées</h2>
<h3><a href="fiche-par-type.php?id_fiche=4">salade</a></h3>
<h3><a href="fiche-par-type.php?id_fiche=5">feuilleté</a></h3>
<h3><a href="fiche-par-type.php?id_fiche=6">oeuf mayonnaise</a></h3>
<h3><a href="fiche-par-type.php?id_fiche=7">terrine maison</a></h3>
1
moderno31 Messages postés 870 Date d'inscription mardi 23 juin 2009 Statut Membre Dernière intervention 8 août 2012 92
27 sept. 2009 à 17:48
Bonjour
Ta requête n'as pas de sens !
Group by s'emploi pour aggréger, regrouper des champs lors d'un COUNT, SUM, AVG...
CE qui a du sens
SELECT count(*) as nb FROM fiches_categorie WHERE menu='Alimentaire' GROUP BY sous_menu ORDER BY sous_menu;
Peux-tu maintenant précicer le contexte de tes données. Parce qu'on ne peux pas deviner pour t'aider au mieux.
0
Delphine97224 Messages postés 99 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 9
27 sept. 2009 à 21:39
Salut,

Je sais que GROUP BY s'utilise souvent quand on utilise COUNT mais moi ce que je veux c'est dans une div en H2 donc comme un titre je rentre le sous-menu et ensuite en H3 je liste les produits qui sont en rapport avec le sous-menu. Dans ma base de données chaque article a un menu et un sous-menu. Prenons par exemple boissons (sous-menu) et toutes les autres boissons (produits) ce que je souhaiterais qui s'affiche c'est en H2 boissons et toutes les boissons en dessous. Pour le HTML y'a pas de soucis je connais c'est juste comment aller chercher dans ma base de données le titre de chaque sous-menu et en dessous afficher tous les produits sachant que j'ai énormément de sous-menus et que je ne pourrais pas tout le temps écrire des WHERE. Je veux juste afficher. Compter je m'en fous un peu, c'est pas trop essentiel.

Je te remercie pour ton aide.
0
sonia37 Messages postés 39 Date d'inscription jeudi 12 avril 2007 Statut Membre Dernière intervention 29 décembre 2010 2
28 sept. 2009 à 06:12
Je crois que c'est ce que tu veux mais je ne suis pas sûre d'avoir compris.

<?php
$html =""; //ou n'importe quel nom de variable
while($donnees = mysql_fetch_array($reponse))//une boucle while pour avoir tous les sous-produits
$html .='<h3><a href="fiche-par-type.php?id_fiche=' .$donnees['id'] . '">' . $donnees['produit'] . '</a></h3>';
echo($html);//Affichage de ce que contient la variable
?>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sonia37 Messages postés 39 Date d'inscription jeudi 12 avril 2007 Statut Membre Dernière intervention 29 décembre 2010 2
28 sept. 2009 à 06:12
a
0
Delphine97224 Messages postés 99 Date d'inscription lundi 6 juillet 2009 Statut Membre Dernière intervention 8 septembre 2011 9
8 oct. 2009 à 22:45
Je te remercie pour ton aide, le conseil et le cadeau. Je n'ai lu la réponse qu'aujourd'hui et je te remercie.
C'était en effet la solution à ma question.
0