grouper les résultats

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : grouper les résultats

par Xenon_54 » 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.

par Invité » 30 déc. 2006, 23:25

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

par Truc » 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>';

par cadix » 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

par cadix » 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 ..

par Hubert Roksor » 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 ?

par Xenon_54 » 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.

par mere-teresa » 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 ?

par Ajoloca » 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;

par Invité » 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

par Ajoloca » 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.

par the dreamer » 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:

grouper les résultats

par cadix » 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