Aller au contenu

Group by, or not ?


Sujets conseillés

Posté

'soir,

Un souci d'ordre de tri me fait poster, je m'explique:

Une requête simple entre plsuieurs tables avec jointure, pour laquelle je souhaite une récupération triée sur deux champs.

Le premier tri devant se faire par le champ "libelle" , le deuxième par un champ date:

$mysql->query("SELECT id_article, libelle, date, titre FROM rub_sport, ssrub_sport, article where
article.id_rub_sport = rub_sport.id_rub_sport and
article.id_ssrub_sport = ssrub_sport.id_ssrub_sport and
rub = 'rubrique_1' ORDER BY date DESC");

Le champ date correspond à la date d'insertion de l'enregistrement. Je souhaiterai afficher les titres correspondant à un libellé, en ne faisant apparaître qu'une fois (à l'affichage) le libellé, autrement dit:

Libellé_1

Titre_1 (du libellé_1)

Titre_2 ((du libellé_1)

Titre_3 (du libellé_1)

Libelle_2

Titre_1 (du libellé_2)

Titre_2 (du libellé_2)

Titre_2 (du libellé_2)

Etc.

Or, si j'ajoute une clause GROUP BY libelle, avant l'ORDER BY, tout foire.

Pourriez-vous m'aidez ?

Merci,

xpatval

Posté

Bonsoir,

Pour schématiser, la clause GROUP BY ne permet pas directement d'obtenir les résultats que tu souhaites. Elle est utilisée pour permettre au fonction d'agrégation (SUM, AVG, etc.) d'être exécutée individuellement chaque valeur d'une certaine colonne. Cette partie de ce cours sur SQL t'expliquera mieux (et par l'exemple) ce dont il est question.

Pour réaliser ce que tu veux, tu peux effectivement utiliser GROUP BY pour récupérer tous les libellés (Libellé_1, Libellé_2, etc.) et éventuellement des "statistiques" qui y sont liées (Nombre de titres, etc.) et ensuite avec le langage de programmation que tu utilises (PHP) parcourir les résultats et obtenir les titres pour chaque libellé. C'est une solution assez coûteuse au niveau des ressources MySQL (une requête pour les libellés... puis une requête par libellé... pour une utilisation à petite échelle pourquoi pas :S).

Sinon la solution du ORDER BY semble la plus appropriée... ensuite à toi de réaliser la partie logique qui en parcourant les résultats "séparera" les libellés (il suffit de stocker le dernier libellé et le comparer au libellé courant de le boucle... s'il est différent tu effectue une séparation). Cette solution est très peu coûteuse au niveau des ressources.

Bonne continuation.

P.S. : Le ORDER BY serait :

ORDER BY libelle ASC, date DESC

Étant donnée que tu souhaite trier les éléments également par date.

Posté

La partie logique était ok. Seule la requête pêchait...

Merci de ta (bonne) réponse. C'est tellement simple que passer du temps sur ce genre d'anerie (s'égarer dans la solution) est foncièrement énervant... :whistling:

xpatval

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...