requete sql: classer par ordre alpha en commencant par une lettre donn - SQL/NoSQL - Programmation
Marsh Posté le 16-05-2007 à 13:56:51
Citation : J'espère avoir été assez clair |
Désolé, mais il manque le nom de la base de données (MySQL, Oracle, Access, ..., ?), et il manque une explication sur le lien entre la lettre aléatoire et les champs (pourquoi associer "M" et "tttttttttttt" ? je m'attendais à avoir un lien entre "M" et "MMM" ou "Mtt" ou "tttMttt", mais je ne vois pas de lettre "M" dans "tttttttttttt" ).
Marsh Posté le 16-05-2007 à 17:32:47
Désolé j'ai bien avancé mais j'ai toujours besoin d'aide Voici un descriptif de ma situation.
J'utilise Mysql/sql.
Code :
|
Ma requete a un peu évolué
Code :
|
Voila le resultat devrait etre :
Code :
|
J'explique il classe à partir de la lettre f..... (cette lettre est normalement générée aléatoirement)
d'abord les adhérents puis à partir de la lettre a les non adhérents
C'est pour afficher aléatoirement les adhérents en premier page puis les non adhérents
mais moi avec ma requete il affiche :
Code :
|
il classe par ordre alpha à partir de f mais pas par adhérent.
Une solution serait donc d'intégrér une seconde condition dans le when pour dire SI au dessus de F et adhérent etc mais j'arrive pas a intégrer un AND. J'obtiens à chaque fois une erreur.
Aidez moi s'il vous plaît ca fait des heures que je cherche
Marsh Posté le 16-05-2007 à 19:31:57
Un truc comme ça ?
Code :
|
PS : Codé sous SQL Server 2005 Express. Le nom des fonctions et leurs paramètres peut varier par rapport à MySQL.
Marsh Posté le 18-05-2007 à 09:17:56
han c'est presque cela mais en faite il classe également les NON-adhérents à partir de M. Mais moi je veux que les non adhérents il les classe à partir de la lettre A
Marsh Posté le 18-05-2007 à 10:31:10
(t'es pas relou toi )
Code :
|
A tester par contre...
En tout cas, ça s'exécute sans erreur. Mais j'ai pas envie de re-créer un jeu de test, et j'ai pas de table sous la main qui me permette de vérifier l'algo
Marsh Posté le 18-05-2007 à 10:34:00
A noter que c'est particulièrement lent chez moi sur une table de 2 413 280 lignes (1 minutes et 50 secondes pour s'exécuter complètement).
Marsh Posté le 18-05-2007 à 10:38:10
je vais tester cela je te remercie
Marsh Posté le 18-05-2007 à 10:42:00
haaaa merci beaucoup ca marche
2 jours que je suis dessus lol !!
Tu peux m'expliquer cette partie la de la requete
case adherent when 1 then sign(ascii(upper(substring(nom 1, 1))) - ascii('M') + .1) else 1 end DESC, nom
JE connais case when then mais tu peux m'expliquer ton fonctionnement, si cela ne te dérange pas car tu m'as déja bien aider. !!!
Encore merci
Marsh Posté le 18-05-2007 à 11:15:26
Je fais un premier tri en fonction de la valeur d'adherent, puisque c'est le premier point de séparation : les adherent en premier, les autres ensuite.
Ensuite, je prends le code ASCII du premier caractère (en majuscule) de mon mot.
Je lui soustrais le code ASCII de M (lettre aléatoire dans ton cas) et j'ajoute 0,1 pour ne pas avoir de possibilité d'avoir un 0 (ça rajouterait un test inutile).
Ainsi, quand c'est négatif, c'est que le mot commence par une lettre inférieure à M, et si c'est positif, c'est que ça commence par une lettre suppérieure ou égale. SIGN() me renvoi donc -1 ou 1, ce qui me permet de trier mes lignes sur le critère de "plus petit ou plus grand que M".
Ensuite, il me reste plus qu'à ne faire de tri sur ce champ que lorsque "adherent" vaut 1. C'est ce que fait le "CASE". Lorsque adherant vaut 1, alors je tri par le truc que je viens d'expliquer et dans le cas contraire, je fais un tri sur la constante 1 (donc pas de tri).
Il ne reste plus qu'à réordonner mes 3 sous-groupes en fonction de leur nom.
Marsh Posté le 16-05-2007 à 10:32:14
bonjour,
je cherche a effectuer une requête qui va me classé les différents entreprises de ma bdd par ordre alphabétique mais à partir d'une lettre tiré préalablement aléatoirement. et par adhésion à une organisation.
Par exemple dans ma table j'ai:
Entreprise adhésion 1 pour adhérer et 0 pour non adhérent.
tttttttttttt 1
oooooooooo 0
nnnnnnn 0
fffffff 1
aaaaaaa 1
xxxxxx 1
mmmmmm 0
PAr exemple la lettre générée aléatoirement est: M la requete doit donc m'afficher :
tttttttttttt
xxxxxx
aaaaaaa
fffffff
mmmmmm
nnnnnnn
oooooooooo
elle classe d'abord les adhérent en commencent par la lettre générée puis les non adhérent par ordre alpha à partir de A
J'espère avoir été assez clair
Donc je cherche de l'aide, des pistes etc pas la réponse s'il vous plaît
merci d'avance.