group by utiliser toutes les données

  • Auteur de la discussion Auteur de la discussion Sha-ka
  • Date de début Date de début
Nouveau WRInaute
Bonjour.

J'ai un peu honte, je sais pas comment régler ce problème...
J'ai des données que j'aimerais extraire par mois, pour ce faire, j'ai un champ Mois, mais j'aimerais aussi faire un tri par catégorie.
Jusque là, pas de souci. J'arrive à tout afficher. Ou presque. En effet, j'aimerais pouvoir afficher toutes les données qui font parti du mois sélectionné, mais aussi et surtout afficher tout les noms appartenant aux catégories. Passons à du plus concret :

Code:
$select=mysql_query("SELECT * FROM saison WHERE Mois='$mois' GROUP BY Categorie")
    or die(mysql_error());
	
	$nb=mysql_num_rows($select);
	
echo '<h3>Aliments du mois</h3>';
	
while($elect=mysql_fetch_assoc($select)){

echo '<strong>'.$elect[Categorie].'</strong> : '.$elect['Nom'].'<br /> ';



Donc là, ça m'affiche :

Aromate : oignon
Champignon : morille
Fruit : citron
Légume : betterave
Salade : laitue

Et j'aimerais que ça m'affiche quelque chose comme :

Aromate : oignon
Champignon : morille
Fruit : citron, pomme, poire, banane, etc
Légume : betterave, haricots, petits pois, etc
Salade : laitue, frisée

Comment faire ? D'avance merci !
 
WRInaute discret
Que pense-tu de ça ?

Code:
$select=mysql_query("SELECT * FROM saison WHERE Mois='$mois' GROUP BY Categorie") or die(mysql_error());
$nb=mysql_num_rows($select);
echo '<h3>Aliments du mois</h3>';
while($elect=mysql_fetch_assoc($select)){
$aliment[Categorie].=$elect['Nom'].',';}
echo '<pre>';
print_r($aliment);
echo '</pre>';

C'est juste pour t'aider, crie pas que c'est pas vraiment ce que tu veux :p je suis fatigué :p

EDIT : j'ai mieux :p

Code:
$select=mysql_query("SELECT * FROM saison WHERE Mois='$mois' GROUP BY Categorie") or die(mysql_error());
$nb=mysql_num_rows($select);
echo '<h3>Aliments du mois</h3>';
$nom_categories=NULL;
while($elect=mysql_fetch_assoc($select))
{
$nom_categories[] = $aliment['Categorie'];//ainsi t'as tous les catégorie mais avec des doublons
$aliment['Categorie'].=$elect['Nom'].',';//on incrémente une chaine de caractères du nom de ta catégorie
}
array_unique ($nom_categories);//on vire les vilains doublons

foreach($nom_categories as $valeur)//on parcours le tableau des catégories
{
echo $aliment[$valeur].'<br />';//on affiche la valeur qu'on as incrémenter plus haut :)
}
J'ai pas tester, mais je pense que ça marche du tonnerre :)
Tu me doit 10 euro pour le retard à mon RDV avec mon lit :lol:

REDIT: ah bah nan, ça peut pas marcher :( attend je vais continue à chercher ;)
 
WRInaute discret
Code fonctionnel =D (je l'ai tester hein! :p )
mais on peux surement l'améliorer mais je tient plus debout avec tes conneries :roll:
Code:
$fruits=NULL;
$nom_categories=NULL;

$fruits=array(
'aromate'=>'oignon',
'morille'=>'champignon',
'citron'=>'fruit',
'pomme'=>'fruit',
'poire'=>'fruit',
'banane'=>'fruit',
'etc'=>'fruit',
'betterave'=>'legume',
'haricots'=>'legume',
'petits pois'=>'legume',
'etc'=>'legume',
'laitue'=>'salade',
'frisee'=>'salade',
);

function search_in_array($array=NULL,$search=NULL)
{
	if($array==NULL || $search==NULL){return;}
	$return=NULL;
	foreach($array as $cle => $valeur)
	{
		if ($valeur==$search)
		{
			if($return!=NULL){$return.=', ';}
			$return.=$cle;
		}
	}
	echo $search,' : '.$return;
}

search_in_array($fruits,'fruit');

A toi de le transformer pour utiliser ta BDD ;)

ADMIRE
ADMIRE
ADMIRE

Cette fonction magique fait tout ce que tu veut :p Elle ne demande qu'un seul parametre : ton array ;) Le reste, elle le fait :p
Mais si tu veut recherche juste un terme en particulier, tu le passe en deuxième paramètre :D :D :D
Code:
<?php

$fruits=array(
'aromate'=>'oignon',
'morille'=>'champignon',
'citron'=>'fruit',
'pomme'=>'fruit',
'poire'=>'fruit',
'banane'=>'fruit',
'etc'=>'fruit',
'betterave'=>'legume',
'haricots'=>'legume',
'petits pois'=>'legume',
'etc'=>'legume',
'laitue'=>'salade',
'frisee'=>'salade',
);

function search_erase_in_array($array=NULL,$search=NULL,$erase=NULL)
{
	if($array==NULL){return;}

	if($search==NULL)
	{
		$nom_categories=array_unique(array_values($array));
	}
	else
	{
		$nom_categories=array($search);
	}
	$nb_calcul=0;
	foreach($nom_categories as $cle_1)
	{
		$return=NULL;
		foreach($array as $cle_2 => $valeur_2)
		{
			$nb_calcul++;
			if ($cle_1==$valeur_2)
			{
				if($return!=NULL){$return.=', ';}
				$return.=$cle_2;
				if($erase==true){unset($array[$cle_2]);}
			}
		}
		echo $cle_1,' : ',$return,'<br />';
	}
echo 'nb_calcul : ',$nb_calcul;
}

search_erase_in_array($fruits);
search_erase_in_array($fruits,'salade');
search_erase_in_array($fruits,'salade',true);

J'explique ?
Le code creer un autre array avec les valeurs du premier, retire les doublons
il as donc une belle listes :)
il fait une boucle de comparaison et si il c'est bon, il incrémente une chaine de caractères qu'il restitue après ;)
Il y a trois parametres :
le premier est obligatoire! c'est l'array qui fout analyser,
Le deuxieme est facultative, c'est le terme que vous rechercher (si vide, il recherchas tout :) )
le troisieme accélère le traitement en supprimant les entrés de l'array qui sont déjà était attribués à une liste :p

Vous avez des idées d'améliorations? Pas moi :mrgreen:

On peux pas faire mieux ;) (a part supprimer les entrés mais si on veux faire plusieurs recherches, c'est pas génial :/ )
 
WRInaute accro
j'ai pas regardé le code proposé par Sonn mais ce qui me semble évident c'est que ta clause GROUP BY est la cause de ton souci puisqu'elle va fusionner (grouper) plusieurs records pour ne t'en livrer qu'un par type de catégorie.

Maintenant il y a plusieurs moyen de contourner le problème. En faisant une requête secondaire par exemple une fois chaque catégorie identifiée. Ou plus simplement en virant la clause GROUP BY et en la remplaçant par une clause ORDER BY qui te délivrera tous les fruit par catégorie de saison mais qui au niveau de l'affichage nécessitera un traitement pour éviter d'afficher la saison à chaque itération (a mon avis le plus simple et le moins gourmand en ressource).

Par exemple (pas vérifié) :
PHP:
<span class="syntaxdefault">$mois </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">'Mars'</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">$select</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">mysql_query</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"SELECT Categorie, Nom FROM saison WHERE Mois='$mois' ORDER BY Categorie"</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">echo </span><span class="syntaxstring">'<h3>Aliments du mois</h3>'</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">$OldCat </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">''</span><span class="syntaxkeyword">;<br />while(</span><span class="syntaxdefault">$record</span><span class="syntaxkeyword">=</span><span class="syntaxdefault">mysql_fetch_array</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$select</span><span class="syntaxkeyword">)){<br /></span><span class="syntaxdefault">  $Cat </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $record</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'Categorie'</span><span class="syntaxkeyword">];<br /></span><span class="syntaxdefault">  $Aliment </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $record</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'Nom'</span><span class="syntaxkeyword">];<br /></span><span class="syntaxdefault">  if</span><span class="syntaxkeyword">((</span><span class="syntaxdefault">$OldCat </span><span class="syntaxkeyword">==</span><span class="syntaxdefault"> </span><span class="syntaxstring">''</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">||</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$Cat </span><span class="syntaxkeyword">!=</span><span class="syntaxdefault"> $OldCat</span><span class="syntaxkeyword">)){<br /></span><span class="syntaxdefault">    </span><span class="syntaxcomment">// si on est en début d'itération (OldCat vide)<br /></span><span class="syntaxdefault">    </span><span class="syntaxcomment">// OU qu'on a changé de catégorie (OldCat et Cat différents)<br /></span><span class="syntaxdefault">    </span><span class="syntaxcomment">// afficher le nom de catégorie ET l'aliment<br /></span><span class="syntaxdefault">    echo </span><span class="syntaxstring">'<strong>'</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$Cat</span><span class="syntaxkeyword">.</span><span class="syntaxstring">'</strong> : '</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$Aliment</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">  </span><span class="syntaxkeyword">}else{<br /></span><span class="syntaxdefault">    </span><span class="syntaxcomment">// sinon afficher juste l'aliment précédé d'une virgule<br /></span><span class="syntaxdefault">    echo </span><span class="syntaxstring">', '</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">$Aliment</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">  </span><span class="syntaxkeyword">}<br /></span><span class="syntaxdefault">  $OldCat </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> $Cat</span><span class="syntaxkeyword">;</span><span class="syntaxdefault"> </span><span class="syntaxcomment">// mettre a jour l'ancienne catégorie avec la courante pour le test a la prochaine itération<br /></span><span class="syntaxkeyword">}</span><span class="syntaxdefault"> </span>

Je te laisse chercher comment gérer le souci des <br/> car c'est pas intrinsèquement le problème a la base.
 
Nouveau WRInaute
Parfait, ça marche, merci beaucoup :) Effectivement le souci venait du group by, en l'utilisant c'est trop fastidieux de devoir faire aliment par aliment, en tout cas merci à vous deux !
 
Discussions similaires
Haut