grouper les résultats

cadix
Invité n'ayant pas de compte PHPfrance

29 déc. 2006, 00:15

Bonsoir,

Voilà, j'ai une table qui contient un champs X et un champs Y

plusieurs lignes contiennent la même valeur pour le champs X avec des valeurs champs Y différentes :
ex : ligne 1 => champs X=bonjour champs Y = dimanche
ligne 2 => champs X=bonjour champs Y = samedi

je voudrais savoir comment faire pour récupérer dans un tableau associatif une seule fois la valeur du champs X et y associer les valeurs du champs Y.

Y a t-il une commande sql qui permet de faire cela ?

merci d'avance pour votre aide

Eléphanteau du PHP | 25 Messages

29 déc. 2006, 00:57

Code : Tout sélectionner

SELECT X, Y GROUP BY X
un truc dans le genre pour la requête :wink:

après jpense que t'as pas besoin d'aide pour le tableau :mrgreen:

ViPHP
ViPHP | 1961 Messages

29 déc. 2006, 01:03

Bonsoir,
Ce que tu veux faire n'est pas faisable directement en SQL.
En SQL tu obtiendras systématiquement les deux champs dans chaque ligne.
Tu devras passer par un langage "évolué" (C, C++, Java, PHP, ....) pour obtenir ta mise en forme à partir des données SQL.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Invité
Invité n'ayant pas de compte PHPfrance

29 déc. 2006, 01:06

le problème c'est qu'avec cette requete, je ne récupère qu'une seule ligne pour la valeur de Y

ViPHP
ViPHP | 1961 Messages

29 déc. 2006, 01:13

Si tu parles de la requête du post précédent, c'est normal, elle est incomplète.
La syntaxe est
SELECT champ1, champ2, ..., champX FROM nom_table GROUP BY nom_champ;
Si on dit que ta table s'appelle "tbl" et tes champs "chpX" et "chpZ" ta requête donnerait
SELECT chpX, chpZ FROM tbl GROUP BY chpX;
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

29 déc. 2006, 11:37

Peux tu faire un export SQL de ta table (en changeant les noms des champs et les données si confidentiels) et mettre ici les requêtes de création de table, pour qu'on puisse se créer la mm structure pour faire nos tests de requête ?
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Mammouth du PHP | 1885 Messages

29 déc. 2006, 16:02

Comme expliqué précédemment, ce n'est pas directement possible via SQL.

Il s'agit exactement du même problème rencontré lorsque l'on vient pour afficher tous les forums d'une catégorie sous phpBB. Il faudra alors faire n+1 requêtes.

1 pour récupérer toutes les catégories et n en bouclant sur les résultats pour récupérer les forums en questions.

Il y a quelques articles traitant de ce problème et des solutions possibles:
http://sql.developpez.com/arborescence/
http://www.sitepoint.com/article/hierar ... a-database
http://dev.mysql.com/tech-resources/art ... -data.html

Donc finalement, tu te dis qu'une boucle sur une requête et un bon système de cache sera d'autant plus efficace si tes noeuds ne sont pas trop profonds.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

29 déc. 2006, 16:14

À priori je ne pense pas que vous parliez de la même chose, comme le suggérait mere-teresa un échantillon de la base permettrait d'y voir plus clair.

Sinon, sous MySQL uniquement, je pense que la solution se situe aux alentours de

Code : Tout sélectionner

SELECT X, GROUP_CONCAT(Y) AS Y FROM table GROUP BY X
Ou encore un simple SELECT * en utilisant le champs X comme clé du tableau PHP ?

cadix
Invité n'ayant pas de compte PHPfrance

29 déc. 2006, 21:57

merci pour toutes ces précisions...

je vais regarder cela et tester ... je reviens un peu plus tard sur cette question ..

cadix
Invité n'ayant pas de compte PHPfrance

30 déc. 2006, 17:37

Bon ! j'ai testé la fonction GROUP_CONCAT : ca ne fonctionne pas...

en fait, j'ai bricolé un petit traitement php qui vaut ce qu'il vaut ...
$query="SELECT champs1  from es.orga WHERE champs2 like '%$var%' GROUP BY champs1";	
$sql=mysql_query($query);
$num=mysql_num_rows($sql);
while($result=mysql_fetch_array($sql))

{
$a[]=$result['champsX'];//je veux récupérer toutes les lignes dans un tableau $count=count($a);$val=implode(" et ", $a);//implode pour transformer le tableau en chaine de caractère

if($count==$num){echo"$val";}//j'affiche uniquement la dernière ligne, sinon j'obtiendrais quelque chose du type : val1
                                                               val1 et Val2
                                                               val1 et val2 et val3 etc...

voilà ! ca fonctionne, même s'il y a sans doute plus simple...le seul problème avec ce traitement, c'est si je veux éditer un lien href sur les valeurs affichées, je ne peux pas puisque le lien portera sur toute la ligne : val1 et val2 et val3

si vous voyez plus simple !!?? merci d'avance

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

30 déc. 2006, 19:39

Sur la proposition d'Hubert
Ou encore un simple SELECT * en utilisant le champs X comme clé du tableau PHP ?
$query="SELECT champX, champY  from es.orga WHERE champY like '%$var%'";    
$sql=mysql_query($query);

$tab = array();
while($result=mysql_fetch_array($sql))
{ 
	$tab[$result['champX']][]= $result['champY'];
}

echo '<pre>';
var_dump($tab);
echo '<pre>';

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

30 déc. 2006, 23:25

j'essaie cette formule...mais le résultat est identique à mon traitement précédent

Mammouth du PHP | 1885 Messages

30 déc. 2006, 23:40

Il n'y a pas de moyens directement intégrées à SQL pour faire ce genre de manipulations de données.

Réfère-toi à mon précédent message. Ce sont les solutions disponibles actuellement.

Sinon, tu peux toujours faire ceci pour premièrement récupérer toutes les valeurs possibles de x:

Code : Tout sélectionner

SELECT x FROM taTable GROUP BY x
Ensuite tu boucles sur les résultats en faisant une requête à chaque résultat:

Code : Tout sélectionner

SELECT y FROM taTable WHERE x=$x
Il s'agit évidemment d'une solution pas très optimale puisqu'il s'agit de faire n+1 requêtes. Donc si tu as 78 x différents, tu vas avoir 79 requêtes. (pas super pour ton serveur SQL)

Voici ce que phpBB2 fait pour l'affichage des forums par catégories:

1) Sélection de toutes les catégories. Stockage dans une variable tableau des résultats.
2) Sélection de tous les forums et leur catégorie. Stockage dans une variable tableau des résultats.
3) Boucle sur les catégorie. Boucle sur les forums et affichage de ceux qui sont dans la catégorie.

Donc il boucle sur les catégories et reboucle sur TOUS les forums à chaque fois, à la recherche d'un forum membre de la catégorie.

Avec cette solution tu as seulement 2 requêtes SQL (à comparer à n+1) mais tu auras plus de tours de boucle pour la requête des forums membres.
La programmation est l'expression de la poésie d'un programmeur
Génération PHP