requete sql: classer par ordre alpha en commencant par une lettre donn

requete sql: classer par ordre alpha en commencant par une lettre donn - SQL/NoSQL - Programmation

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.

Reply

Marsh Posté le 16-05-2007 à 10:32:14   

Reply

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" ).

Reply

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 :
  1. Table: entreprises
  2. entreprise - adherent
  3. cccc              1
  4. pppp              1
  5. aaaa              0
  6. rrrrr                1
  7. eeee               0
  8. tttt                0
  9. yyyy              1
  10. zzzz               1
  11. bbbb              0
  12. hhh                1


 
Ma requete a un peu évolué

Code :
  1. SELECT * ,
  2. CASE entreprises
  3. WHEN upper( substring( entreprises, 1, 1 ) ) < 'f'
  4. THEN '1'
  5. WHEN upper( substring( entreprises, 1, 1 ) ) > 'f'
  6. THEN '0'
  7. END AS ORDRE_AFFICHAGE
  8. FROM entreprises
  9. WHERE produits LIKE '%9%'
  10. ORDER BY ORDRE_AFFICHAGE DESC , entreprises
  11. LIMIT 0 , 15


 
Voila le resultat devrait etre :
 

Code :
  1. Table: entreprises
  2. entreprise - adherent - ORDRE_AFFICHAGE
  3. pppp              1                    1
  4. rrrrr                1                    1
  5. yyyy              1                    1
  6. zzzz               1                    1
  7. cccc              1                    1
  8. hhh                1                    1
  9. aaaa              0                     0
  10. bbbb              0                     0
  11. eeee              0                     0
  12. tttt                0                    0


 
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 :
  1. Table: entreprises
  2. entreprise - adherent - ORDRE_AFFICHAGE
  3. pppp              1                    1
  4. rrrrr                1                    1
  5. tttt                0                    0
  6. yyyy              1                    1
  7. zzzz               1                    1
  8. aaaa              0                     0
  9. bbbb              0                     0
  10. cccc              1                    1
  11. eeee              0                     0
  12. hhh                1                    1


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 :bug:


Message édité par kakahn le 16-05-2007 à 17:43:02
Reply

Marsh Posté le 16-05-2007 à 19:31:57    

Un truc comme ça ?
 

Code :
  1. SELECT nom, adherent
  2. FROM entreprise
  3. ORDER BY adherent DESC, sign(ascii(upper(substring(nom, 1, 1))) - ascii('M') + .1) DESC, nom


 
PS : Codé sous SQL Server 2005 Express. Le nom des fonctions et leurs paramètres peut varier par rapport à MySQL.


Message édité par MagicBuzz le 16-05-2007 à 19:33:29
Reply

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

Reply

Marsh Posté le 18-05-2007 à 10:31:10    

(t'es pas relou toi :o)
 

Code :
  1. SELECT nom, adherent
  2. FROM entreprise
  3. ORDER BY adherent DESC, case adherent when 1 then sign(ascii(upper(substring(nom, 1, 1))) - ascii('M') + .1) else 1 end DESC, nom


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 :p

Reply

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).

Reply

Marsh Posté le 18-05-2007 à 10:38:10    

je vais tester cela je te remercie


Message édité par kakahn le 18-05-2007 à 11:27:00
Reply

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

Reply

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed