IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Tri numérique et alphabétique sur la même colonne


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut Tri numérique et alphabétique sur la même colonne
    Bonjour,

    J'ai une question à propos du tri d'un champ VARCHAR qui peut contenir des chiffres.

    Voici le résultat avec un ORDER BY classique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT mod_nom FROM modele WHERE mod_typ_id = 5 ORDER BY mod_nom;
    +------------+
    | mod_nom    |
    +------------+
    | C 360      |
    | I 120      |
    | I 30       |
    | IC 150     |
    | IC 300 GAZ |
    | IDC 150    |
    | R 150      |
    +------------+
    Presque bon, si ce n'est que "I 30" devrait être après "I 120";


    Avec un CAST ce problème est réglé, par contre le reste n'est plus dans l'ordre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT mod_nom FROM modele WHERE mod_typ_id = 5 ORDER BY CAST(mod_nom AS UNSIGNED);
    +------------+
    | mod_nom    |
    +------------+
    | I 30       |
    | I 120      |
    | C 360      |
    | R 150      |
    | IC 150     |
    | IDC 150    |
    | IC 300 GAZ |
    +------------+

    L'ordre "logique" que je voudrais avoir est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    +------------+
    | mod_nom    |
    +------------+
    | C 360      |
    | I 30       |
    | I 120      |
    | IC 150       |
    | IC 300 GAZ |
    | IDC 150    |
    | R 150      |
    +------------+
    Y a-t-il une solution pour obtenir ce dernier ordre ?
    Sachant que cette colonne peut contenir des noms simples sans chiffres ou alors des chiffres uniquement (enfin avec un signe * ou / au milieu).

    J'ai vu également une idée avec un CASE pour faire un ORDER BY différent si la valeur est numérique ou alphabétique, mais ce n'est pas applicable ici.

    Merci par avance.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Si le motif de la chaîne de caractère n'est pas systématique, ça va être bien compliqué... D'ailleurs, le SQL n'est pas vraiment fait pour ça...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre confirmé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Points : 502
    Points
    502
    Par défaut
    si ton libellé est toujours formaté de la meme façon, tu tri par tout ce qui est AVANT le premier espace
    puis par ce qui est APRèS (avec un CAST en prime)
    puis par la fin.

    ça donnerait un truc genre:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ORDER BY LEFT(mod_nom, INSTR(mod_nom, ' ')),
             CAST(mod_nom AS UNSIGNED)

    c'est peut etre à adapter, mais le principe est là
    Juvamine

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Citation Envoyé par juvamine Voir le message
    si ton libellé est toujours formaté de la meme façon,
    Ca n'a malheureusement pas l'air d'être le cas :
    Sachant que cette colonne peut contenir des noms simples sans chiffres ou alors des chiffres uniquement (enfin avec un signe * ou / au milieu).
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Cela semble un problème de modélisation : il me semble que l'on trouve plusieurs codes dans un libellé... Si c'est bien le cas, il faudrait créer 3 colonnes de codes avec chacune en tant que clé étrangère vers une table de référence où il y aurait le libellé.

    Du coup le libellé que vous avez actuellement serait calculé en concaténant les 3 libellés correspondant aux codes et vous pourriez trier sur chacun des 3 libellés comme bon vous semble, même si vous n'affichez que la version concaténée.

  6. #6
    Membre confirmé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par ced Voir le message
    Ca n'a malheureusement pas l'air d'être le cas :
    Pardon
    Le jeu d'enregistrement m'a enduit d'erreur.
    Juvamine

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Merci pour vos réponses.

    Malheureusement je ne pense pas pouvoir séparer ça en plusieurs colonnes, c'est simplement une colonne qui contient le nom d'un modèle de produit.
    D'ailleurs séparer en plusieurs colonnes uniquement pour le tri ce n'est pas vraiment optimal non ?

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par vichenze Voir le message
    Merci pour vos réponses.

    Malheureusement je ne pense pas pouvoir séparer ça en plusieurs colonnes, c'est simplement une colonne qui contient le nom d'un modèle de produit.
    D'ailleurs séparer en plusieurs colonnes uniquement pour le tri ce n'est pas vraiment optimal non ?
    Non bien sûr ce ne serait pas uniquement pour le tri, mais plus pour une question d'intégrité, pour éviter les erreurs dans les différentes parties de ce libellé, qui visiblement correspondent bien à une certaine codification.

    Cependant, j'imagine que c'est une sorte de fichier fournisseur avec simplement une désignation de modèle sans le détail de ces codes, auquel cas vous ne pouvez pas vous-même scinder le libellé et refaire la codification dans des tables de référence (et ce n'est pas à vous de le faire)... C'est quelque chose comme ça ?

  9. #9
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 40
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par rbaraer Voir le message
    Non bien sûr ce ne serait pas uniquement pour le tri, mais plus pour une question d'intégrité, pour éviter les erreurs dans les différentes parties de ce libellé, qui visiblement correspondent bien à une certaine codification.

    Cependant, j'imagine que c'est une sorte de fichier fournisseur avec simplement une désignation de modèle sans le détail de ces codes, auquel cas vous ne pouvez pas vous-même scinder le libellé et refaire la codification dans des tables de référence (et ce n'est pas à vous de le faire)... C'est quelque chose comme ça ?
    C'est ça effectivement oui.

    Tant pis pour le tri alors...

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par vichenze Voir le message
    C'est ça effectivement oui.

    Tant pis pour le tri alors...
    Non pas forcément, mais c'est moins évident à faire

    Je vous soumets une idée.

    L'idée serait de créer une fonction qui crée à partir du libellé actuel un autre libellé qui se trierait "logiquement", de stocker ce libellé de tri également, puis d'afficher le libellé actuel mais de trier sur l'autre.

    On peut par exemple ajouter des blancs à la fin des textes, des 0 au début des chiffres, suffisamment pour que chaque "zone" du libellé soit de taille fixe et que le tri en tant que chaine de caractère soit celui désiré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    LibelleDeTri
     
    C            000360
    I            000120
    I            000030
    IC           000150
    IC           000300           GAZ
    IDC          000150
    R            000150
    On ajoute la nouvelle colonne mod_nom_tri puis on fait un UPDATE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE modele
    SET mod_nom_tri = fct_calcul_modnomtri(mod_nom);
    Reste à écrire la fonction fct_calcul_modnomtri

Discussions similaires

  1. Je cherche a avoir 2 tri différents sur une même colonne
    Par snooky147 dans le forum Requêtes
    Réponses: 0
    Dernier message: 06/12/2013, 23h21
  2. Tri numérique lors clic sur le titre d'une colonne d'un datagrid
    Par boubou38 dans le forum Windows Presentation Foundation
    Réponses: 0
    Dernier message: 31/08/2012, 14h33
  3. Select 10 valeurs sur la même colonne
    Par Ticoche dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/01/2009, 17h47
  4. Réponses: 2
    Dernier message: 05/04/2008, 17h33
  5. PRIMARY KEY et FOREIGN KEY sur la même colonne ?
    Par SpecialCharacter dans le forum Outils
    Réponses: 4
    Dernier message: 31/01/2008, 17h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo