Effectuer un classement alphabétique suivant le deuxiéme mot

Effectuer un classement alphabétique suivant le deuxiéme mot - PHP - Programmation

Marsh Posté le 02-11-2008 à 12:22:04    

Bonjour à tous et à toutes en ce deux novembre 2008.
 
Je fais appel à vous concernant une requête mysql assez complexe pour moi,
j'ai un champs "personnage", et je fais un affichage alphabétique, jusque là rien de compliquer,
pour la lettre a mon code ressemble à  
[php]select * from personnage where nom like 'a%'[/php]
 
Cependant j'aimerai ajouter une condition à cette requete:  
si le champs nom contient deux mots, que ce soit le deuxieme mot qui soit pris pour le classement.
exemple: Bob Marley serait sur la page M et non sur la page B
 
j'avoue être perdu et ne pas savoir par ou commencer? quelqu'un peut il éclairer ma lanterne?
 
bonne journée et merci.

Reply

Marsh Posté le 02-11-2008 à 12:22:04   

Reply

Marsh Posté le 02-11-2008 à 12:37:34    

ca va etre un peu lourd a faire directement dans la requete SQL , peut etre devrai tu rajouter un champ dans ta table  qui stocke , en clair le mot qui sert a trier

Reply

Marsh Posté le 04-11-2008 à 11:41:07    

coconutes4 a écrit :

[php]select * from personnage where nom like 'a%'[/php]


Juste au passage select * from personnage where LEFT(nom,1)='a'  :jap:  
Il serait plus exact de mettre dans des champs tes Lettres pour 'Trier'
 


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 04-11-2008 à 13:05:32    

grosbin a écrit :

Juste au passage select * from personnage where LEFT(nom,1)='a'  :jap:


Bonne idée, lui dire d'utiliser une syntaxe non standard alors qu'il a une version standard qui marche très bien.[:el g]

Message cité 1 fois
Message édité par skeye le 04-11-2008 à 13:18:36

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 04-11-2008 à 15:12:43    

skeye a écrit :


Bonne idée, lui dire d'utiliser une syntaxe non standard alors qu'il a une version standard qui marche très bien.[:el g]

Et qui permet d'utiliser les index à l'inverse du "left".

Reply

Marsh Posté le 04-11-2008 à 15:19:14    

grosbin a écrit :


Juste au passage select * from personnage where LEFT(nom,1)='a'  :jap:  
Il serait plus exact de mettre dans des champs tes Lettres pour 'Trier'
 


A priori c'est pour le classement le pbs...
 
Et sinon je pense qu'un

Code :
  1. WHERE nom = 'a%'
  2.   OR nom = '% a%'


fonctionnerais pour le filtrage.

Message cité 1 fois
Message édité par MEI le 04-11-2008 à 15:19:28

---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 04-11-2008 à 15:30:18    

MEI a écrit :


A priori c'est pour le classement le pbs...
 
Et sinon je pense qu'un

Code :
  1. WHERE nom = 'a%'
  2.   OR nom = '% a%'


fonctionnerais pour le filtrage.

Erreur :
1) avec "Bob Marley" ta requête afficherait le nom dans les B et dans les M
2) avec "Sophie De la Marre" ta requête afficherait le nom dans les D, les L les S et les M
 
La seule solution qui est à la fois simple et efficace, c'est d'avoir une colonne qui indique le texte servant au tri. Toutes les autres solutions consommeraient trop de ressources processeur et seraient trop compliqué à mettre en oeuvre en SQL.

Reply

Marsh Posté le 04-11-2008 à 15:37:10    

Dans tout les cas faudra faire un calcul un jour ou l'autre. Et bon a priori on ne stocke jamais ce qui est calculable. ;)
 
Le truc c'est que si c'est pour le trie c'est pas trop trop chiant, si c'est pour le filtrage ça implique a vu de nez au moins une requete imbriqué et là ça complexifie pas mal de chose.
 
Le plus simple serais ça se trouve d'avoir un champs nom et un champs prenom :D


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 04-11-2008 à 15:52:23    

MEI a écrit :

Dans tout les cas faudra faire un calcul un jour ou l'autre. Et bon a priori on ne stocke jamais ce qui est calculable. ;)


En théorie on ne stocke pas ce qui est calculable.
En pratique on stocke ce qui demande trop de temps pour être recalculé et ce qui ne peut être calculé par une requête qu'avec de grosses difficultés.
 
Par exemple dans le cas présent il est parti sur l'idée qu'un pseudo de personnage ne serait constitué que d'un prénom (facultatif) et d'un nom. Mais s'il veut gérer un jour les particules (comme les "de la" ) alors sa requête deviendra d'une trop grande complexité pour être faisable s'il n'a pas un champ qui ne contient que le texte à tester.
 
PS : En fait là, c'est plus l'expérience qui parle que les bouquins qu'on étudie en court.

Reply

Marsh Posté le 04-11-2008 à 16:02:28    

omega2 a écrit :


En théorie on ne stocke pas ce qui est calculable.
En pratique on stocke ce qui demande trop de temps pour être recalculé et ce qui ne peut être calculé par une requête qu'avec de grosses difficultés.
 
Par exemple dans le cas présent il est parti sur l'idée qu'un pseudo de personnage ne serait constitué que d'un prénom (facultatif) et d'un nom. Mais s'il veut gérer un jour les particules (comme les "de la" ) alors sa requête deviendra d'une trop grande complexité pour être faisable s'il n'a pas un champ qui ne contient que le texte à tester.
 
PS : En fait là, c'est plus l'expérience qui parle que les bouquins qu'on étudie en court.


Tout dépends en fait le pourquoi d'un seul champs et ce qu'il veut séparer.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Marsh Posté le 04-11-2008 à 16:02:28   

Reply

Marsh Posté le 04-11-2008 à 17:42:36    

Bon, si on part du principe qu'on trie par le dernier mot précédé d'un espace, on peut faire un truc du genre :

Code :
  1. SELECT les champs à afficher, RIGHT(nom, LOCATE(" ", REVERSE(nom))) AS Tri FROM ... WHERE ... ORDER BY Tri


 
J'ai pas testé par contre...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 04-11-2008 à 18:14:04    

rien t'empéche de faire deux champ different lors de la soumission du style explode($mavar, ' ') et de l'envoyé dans les deux champs different et du coup le classement sera plus facile


---------------
Recette cookeo Recette de cuisine
Reply

Marsh Posté le 05-11-2008 à 10:29:50    

omega2 a écrit :

PS : En fait là, c'est plus l'expérience qui parle que les bouquins qu'on étudie en court.


Ah beh t'as pas dû avoir de bons cours, parce que ce que tu expliquais plus haut et qui est tout à fait correct, nos profs nous l'enseignaient.  :D
 
Enfin, quoiqu'on fasse ici en SQL, c'est la garantie de mettre à néant le bénéfice d'un index et de se farcir des table scans, outre des manips de chaînes de caractères sur le DBMS.
 
Si les perfs sont un soucis, faudrait peut-être envisager une colonne qui stocke l'info dans l'ordre lexicographique souhaité (avec "Marley" pour "Bob Marley" et "Marre" pour "Sophie de la Marre", ce qui permettrait de lancer des queries SQL simples et rapides.
 
Donc +1 avec omega3-1 [:spamafote]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Sujets relatifs:

Leave a Replay

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