2010-08-22 5 views
1

J'ai un champ qui contient les noms d'utilisateur dans un mysql db par exemple:Trouver la dernière valeur alphanumérique dans une base MySQL

johndoe2 
johndoe10 
johndoe3 

Si je commande par ce champ DESC je reçois:

johndoe3 
johndoe2 
johndoe10 

Je dois obtenez:

johndoe10 
johndoe3 
johndoe2 

Toute aide appréciée

+0

Quel codage de caractères et quel classement utilisez-vous actuellement? –

+0

Sans un caractère de contrôle séparant la chaîne du nombre, il est extrêmement difficile de récupérer de manière fiable la valeur numérique pour la commande. IE: 'RIGHT (field, 1)' retournerait "0" plutôt que "10" ... –

+0

Vous ne pouviez pas remplir ces chiffres (par exemple: johndoe2 devient johndoe02)? Ou les stocker dans une colonne différente? – NullUserException

Répondre

0

Si la performance n'est pas un problème, pensez à écrire un function like this one to remove non-numeric characters, puis en incluant simplement l'appel dans votre ORDER BY.

SELECT * 
FROM MyTable 
ORDER BY 
     CAST(strip_alpha(UserName) as int) DESC 

Pour une solution plus performante + sans tracas, envisagez d'extraire le numéro du nom d'utilisateur dans une nouvelle colonne. Alors vous pourriez facilement COMMANDER PAR:

SELECT * 
FROM MyTable 
WHERE UserName LIKE 'johndoe%' 
ORDER BY TrailingDigit DESC 
1

Ceci est un bidouillage géant, mais je pense que cela fonctionnera. Si votre nom de colonne est s:

order by 
    (replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(s, '0', ''), '1', ''), '2', ''), '3', ''), '4', ''), '5', ''), '6', ''), '7', ''), '8', ''), '9', ''), 
    length(s) desc, 
    s desc 

sorte par la première partie alphabétique du texte, pour obtenir tous les mêmes noms ensemble, puis par la longueur pour les obtenir à peu près triés numériquement, puis par s. Le dernier order by s fonctionne correctement maintenant parce qu'il est utilisé uniquement pour désambiguïser entre les mêmes noms avec le même nombre de chiffres.

Questions connexes