Dart Posté 7 Septembre 2007 Posté 7 Septembre 2007 Bonjour à tous , Voila le problème , je souhaite créer un identifiant de la forme 22007-(NumId) ou 72007-(NumID) dans une de mes tables. Dans mon code je dois repérer le prochain numéro à créer lorsque je crée un nouveau login. Pour cela , je fais une recherche du genre : SELECT MAX(login)as max FROM `listeinscription` where login LIKE "22007-%"; (le nombre 22007 représente un critère de tri pour moi). Cette méthode fonctionne bien , sauf que lorsque j'arrive à 22007-10 , il me répond que le maximum est 22007-9. J'ai vérifier dans la table et effectivement c'est le cas Quelqu'un aurait une idée du problème ?
Portekoi Posté 7 Septembre 2007 Posté 7 Septembre 2007 Normal, ta chaine n'est pas numérique. Il ne prend pas '10' mais '1'. Donc c'est normal
Dart Posté 7 Septembre 2007 Auteur Posté 7 Septembre 2007 (modifié) Et qu'est-ce que j'ai comme solution pour éviter le problème ? (Ouais , je sais , la passer en Numérique , mais j'peux point.... v_v) Modifié 7 Septembre 2007 par Dart
Portekoi Posté 7 Septembre 2007 Posté 7 Septembre 2007 Fait un replace dans ta requete du '-' par '' et convertis la chaine restante en numérique, juste le temps de la requête
Dart Posté 7 Septembre 2007 Auteur Posté 7 Septembre 2007 Merci de ton aide .... C'est une solution intéressante mais un peu compliqué (en fait surtout pour faire le deuxième replace et tout remettre en ordre). En tout cas je vais regarder ça . Merci encore
Portekoi Posté 7 Septembre 2007 Posté 7 Septembre 2007 Non rien de compliqué et l'ordre se fera tout seul
Portekoi Posté 7 Septembre 2007 Posté 7 Septembre 2007 Et en plus tu n'as pas besoin du 'convert' car la conversion se fait implicitement Ce qui donne : Select max(replace(login ,'-','')) from `listeinscription` where login LIKE "22007-%";
petit-ourson Posté 7 Septembre 2007 Posté 7 Septembre 2007 Et une clef primaire composée, ce ne serait pas mieux ?
marcb Posté 7 Septembre 2007 Posté 7 Septembre 2007 (modifié) Dart, Tu peux aussi faire ça : SELECT max(0 + right(login, length(login) - 6)) as max FROM `listeinscription` where login LIKE "22007-%"; Explication : - je vire les 6 caractères de gauche (22007-) - à adapter s'il y a parfois plus de 5 caractère avant le '-'. - j'ajoute 0 (ça convertit la chaîne en nombre - je prends le max Sinon, tu ne peux pas transformer ton 22007-9 en 22007-00009 ? Ca résoudrait aussi ton problème, le tri se ferait correctement. M Modifié 7 Septembre 2007 par marcb
Leonick Posté 8 Septembre 2007 Posté 8 Septembre 2007 le mieux restant quand même de formater tes nombres (clés) avec 2 octets, soit 09 puis 10, comme cela pas de problème
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant