Aller au contenu

Classement complexe des résultats d'une requête


ollvin

Sujets conseillés

Bonjour,

Je travail sur des pages déjà codées (personnalisation du CMS Artiphp) qui récupèrent des données MySQL avec une requête SELECT sous PHP, puis les traite pour les afficher avec une boucle WHILE (mysql_fetch_array($result)).

Un fonctionnement bien classique quoi. Jusque là, tout va bien. :)

Mais cela fait plusieurs fois que je me heurte au même problème : je voudrais simplement affiner le classement des résultats sans toucher à l'affichage (donc laisser la boucle WHILE telle quelle).

Jusqu'à présent, il sont simplement organisés par un ORDER BY champ dans la requete mais j'aimerais un classement plus complexe.

Par exemple, les articles sont organisés par date. Je voudrais d'abord un classement numérique par le champ ordre, puis classer par date ce qui reste (pas d'ordre défini).

Plus généralement, on retrouve un peu le principe de pertinence d'un moteur de recherche avec de multiples critères de classement (mais pas les mêmes, évidemment).

Jusqu'à présent, il me faut faire deux requêtes, puis dupliquer complètement le traitement, ou tout recoder quand il faut mélanger les résultats. Bref, c'est vraiment pas pratique.

Est-ce qu'on peut mettre plusieurs conditions à ORDER BY ou mettre plusieurs ORDER BY (même si cette synthaxe est incorrecte, je pense à un truc du genre : SELECT... WHERE (ordre!='0' ORDER BY ordre) and (ordre=0 ORDER BY date) ) ?

Peut-être que ma logique ne colle pas du tout. Si un programmeur expérimenté peut venir éclairer ma lanterne...

Merci d'avance

Modifié par ollvin
Lien vers le commentaire
Partager sur d’autres sites

Tu peux effectivement faire un "ORDER BY ordre ASC, date ASC".

Le souci, c'est que si tes éléments "sans ordre" ont un ordre défini à zéro, ils ressortiront en premier (dans le cas d'un tri croissant).

A tester : ne pas remplir le champ "ordre", voire le mettre à NULL

Lien vers le commentaire
Partager sur d’autres sites

Petite conclusion :

En fait, vu que mon champ mySQL était un BIGINT, je ne pouvais pas mettre de valeur NULL. De toute façon, le plus simple a été de mettre une valeur par défaut énorme (9999999), comme ça, ça arrive toujours après mes classements.

Voilà, ça marche comme sur des roulettes.

Merci encore, captain_torche.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

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



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