2009-11-27 11 views
3

est ir possible de trier une colonne par ordre alphabétique mais en ignorant certains mots comme par exemple « Le »MySQL sorte par nom

par exemple

Une requête normale retournerait

string 1 
string 3 
string 4 
the string 2 

Je voudrais revenir

string 1 
the string 2 
string 3 
string 4 

Est-ce possible?

EDIT Veuillez noter que je cherche à remplacer plusieurs mots comme The, A, etc ... Est-ce que cela peut être fait?

Répondre

5

Vous pouvez

SELECT id, text FROM table ORDER BY TRIM(REPLACE(LOWER(text), 'the ', '')) 

mais notez qu'il sera très lent pour les grands ensembles de données car il doit recalculer la nouvelle chaîne pour chaque rangée.

IMO vous êtes mieux avec une colonne séparée avec un index dessus.

Pour plusieurs mots vides, continuez d'imbriquer les appels REPLACE. :)

0

Oui, il devrait être possible d'utiliser des expressions à l'ordre parties:

SELECT * FROM yourTable ORDER BY REPLACE(yourField, "the ", "") 
+1

Peut vouloir ajouter un espace de fin, sinon cela pourrait causer quelques problèmes avec des mots contenant "le", par exemple. plume –

+0

@astander: Bonne idée, merci. – Bobby

0

Cela remplacera tous les principaux "Le" comme un exemple

SELECT * 
FROM YourTable 
ORDER BY REPLACE(Val,'The ', '') 
0

J'ai une liste de musique qui est bien plus de 75 000 enregistrements et j'ai rencontré une situation similaire. J'ai écrit un script PHP qui vérifiait toutes les chaînes commençant par 'A', 'An' ou 'The' et tronquait cette partie de la chaîne. J'ai également converti toutes les majuscules en minuscules et stocké cette chaîne dans une nouvelle colonne. Après avoir défini un index sur cette colonne, j'avais terminé.

De toute évidence, vous affichez la colonne initiale, mais le tri par la colonne indexée nouvellement créée. Je reçois des résultats dans une seconde ou deux maintenant.