Page 1 sur 1

Grouper et trier les résultats d'une requête sur X colonnes

Posté : 19 sept. 2006, 20:43
par alcofribas
Bonjour à tous,

J'essaie depuis ce midi mais c'est vraiment trop compliqué pour moi.
En fait, je dois faire une requête sur trois colonnes, fusionner le résultat et trier l'ensemble par ordre alphabétique pour intégrer le tout dans un menu déroulant.

Voici le code :
<?php
                                $sql="SELECT (continent,etat,region) AS region FROM catalogues";
                                $req = mysql_query($sql);
                                
                                while($result = mysql_fetch_array($req)) {
                                
                                        $zone = $result['region'];
                                        
                                        if (!empty($zone)){
                                                echo'<option value='.$zone.'>'.$zone.'</option>';
                                        }
                                }
?>
J'ai essayé d'utiliser CONCAT(), mais ça me met les trois colonnes sur une ligne du menu déroulant...


En plus j'ai un autre problème, plus dur encore : je peux avoir dans chaque cellule une liste de mots séparés par des virgules, et il faudrait que je transforme cette liste horizontale en liste verticale, encore une fois pour avoir un menu déroulant constitué de mots clés uniques, et non de listes.

J'ai essayé avec les fonctions php mais une fois que je suis dans une boucle while(), il n'est plus possible de trier l'ensemble des résultats, car ils sont pris les uns derrière les autres.

Pouvez-vous m'aider?

Merci d'avance

Posté : 19 sept. 2006, 21:02
par alcofribas
J'essayerais bien cette requête :
$sql="SELECT continent,etat,region FROM catalogues GROUP BY continent,etat,region ASC";

mais je ne sais pas comment en récupérer le résultat pour qu'il soit exploitable sous cette forme :

Code : Tout sélectionner

<option value='.$zone.'>'.$zone.'</option>

Posté : 19 sept. 2006, 21:49
par graphistnet
As tu essayé ta seconde requête avec le reste du code que tu as mis dans ton 1er post?

Posté : 20 sept. 2006, 11:33
par alcofribas
Le problème est que je ne sais pas récupérer le résultat de cette deuxième requête... Avec region, je ne récupère bien sûr qu'une seule colonne

Posté : 20 sept. 2006, 16:38
par alcofribas
J'ai avancé un peu avec ce code, mais j'obtiens le résultat de la 1ère colonne, puis la 2ème, puis la troisième, alors que je voudrais qu'elles fusionnent en restant dans l'ordre alpha :
$sql="(SELECT continent FROM catalogues GROUP BY continent ASC)
                                UNION
                                (SELECT etat FROM catalogues GROUP BY etat ASC)
                                UNION
                                (SELECT region FROM catalogues GROUP BY region ASC)";
                                $req = mysql_query($sql);
                                
                                while($result = mysql_fetch_array($req)) {
                                
                                        $nb = count($result);
                                        
                                        for($i=0;$i<$nb;$i++){ 
                                                if (!empty($result[$i])){
                                                        echo'<option value='.$result[$i].'>'.$result[$i].'</option>';
                                                }
                                        }
                                        
                                }

Posté : 22 sept. 2006, 15:02
par alcofribas
alors personne ne peut m'aider? :(

Posté : 22 sept. 2006, 16:01
par iclo
Tu peux très bien utiliser order by sur plusieurs champs, il triera sur le premier puis sur le deuxième, puis sur le troisième.
genre :

Code : Tout sélectionner

order by champ1 asc, champ2 asc, champ3 asc
Mais il faudrait que tu sois plus clair, car je ne suis pas sû d'avoir bien compris ce que tu veux faire.

En ce qui concerne tes champs qui contiennent des listes de mots avec séparateurs, cela ne semble pas très optimal comme façon de faire, et il vaudrait probablement mieux, revoir la structure de la base de donnée, notamment en ajoutant une table supplémentaire, pour avoir une structure normalisée, plus souple mais surtout plus simple à exploitée par la suite

Posté : 22 sept. 2006, 17:18
par alcofribas
Je crois que tu as raison pour la colonne qui contient ces enregistements séparés d'une virgule. Je vais trouver une autre solution.
Pour ce qui est de la requête, la forme que tu me donnes convient moins biens que celle avec UNION... qui se rapproche du résultat mais ne fait pas totalement son boulot.
En clair : j'ai trois colonnes, je veux m'en faire qu'une (fusionner le résultat de la requête de manière à avoir une liste et non trois), et je veux rager cette liste par ordre alphabétique.
Voici l'état actuel du code :
$sql="(SELECT continent FROM catalogues GROUP BY continent ASC)
                                UNION
                                (SELECT etat FROM catalogues GROUP BY etat ASC)
                                UNION
                                (SELECT region FROM catalogues GROUP BY region ASC)";
                                $req = mysql_query($sql); 
                                
                                while($result = mysql_fetch_array($req)) {
                                
                                        $nb = count($result);
                                        
                                        for($i=0;$i<$nb;$i++){ 
                                                if (!empty($result[$i])){
                                                        echo'<option value='.$result[$i].'>'.$result[$i].'</option>';
                                                }
                                        }
                                }

Posté : 22 sept. 2006, 17:34
par iclo
Je ne comprends probablement pas bien ce que tu veux faire, parce que je ,e vois pas pourquoi le code avec order by ne convient pas.
si tu as tes 3 colonnes bien triées, ce n'est pas un problème de les concaténer en php. Sans compter que 3 select avec union, c'est un peu lourd pour le serveur de base de donnée, surtout si tu as beaucoup de donnée

Maintenant, le fait que pour une même colonne tu ais des valeurs identiques, sous forme de chaine de caractère, montre que la aussi la base de donnée n'est pas très optimale (redondance d'information) et qu'il serait beaucoup mieux d'avoir plusieures tables : une pour les continents, une pour les régions, et une pour les états,. Avec une telle structure ton problème de tris n'en est plus un, tout se fera très simplement dans la boucle en php.

Posté : 22 sept. 2006, 18:30
par alcofribas
comment tu les concatènes en php?