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 :

MySQL : tri selon une sous-chaine d'un champ


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Par défaut MySQL : tri selon une sous-chaine d'un champ
    Bonjour,

    je souhaite récupérer une colonne dans une table, triée selon le nombre trouvé (ou pas) dans cette colonne

    je m'explique en détail :

    j'ai une table ma_table :

    le champ ma_colonne contient des enregistrements qui ressemblent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1101 EPICERIE
    TOTAL
    1 HYPERMARCHE
    1 PGC
    10 ALIMENTAIRE
    2 EPICERIE
    100 BISCOTTES 5.5%
    1001 BISCOTTES SEL 5.5%
    1001 BISCOTTES SEL 5.5%
    1002 BISCOTTES S.SEL 5.5%
    je souhaite récupérer cette colonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ma_colonne FROM ma_table
    triée selon le nombre trouvé en premiere position
    J'arrive à trouver l'espace qui suit mon nombre grace à la fonction POSITION et je peux extraire le nombre grace à la fonction SUBSTRING. Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
    SUBSTRING(
              ma_table.ma_colonne
              FROM 1
              FOR POSITION(' ' IN ma_table.ma_colonne) - 1
                    )
      FROM ma_table
    ce qui me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1101
    TOTAL
    1
    1
    10
    2
    100
    1001
    1001
    1002
    donc mon tri :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ma_colonne FROM ma_table
    ORDER BY SUBSTRING(
              ma_table.ma_colonne
              FROM 1
              FOR POSITION(' ' IN ma_table.ma_colonne) - 1
                    )
    ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1 HYPERMARCHE
    1 PGC
    10 ALIMENTAIRE
    100 BISCOTTES 5.5%
    1001 BISCOTTES SEL 5.5%
    1001 BISCOTTES SEL 5.5%
    1002 BISCOTTES S.SEL 5.5%
    1101 EPICERIE
    2 EPICERIE
    TOTAL
    Le tri n'est donc pas parfait car je fait un tri alphabétique et pas numérique.

    Je voudrais transformer le nombre en VRAI nombre (faire une conversion de type) afin d'appliquer un tri numérique.
    mais je n'y arrive pas
    (la fonction TO_NUMBER d'Oracle n'est pas supportée par MySQL)

    Merci de vos lumieres

  2. #2
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Par défaut
    Bonjour,
    A mon avis il faut utiliser la fonction CAST ou CONVERT, pour arriver à une requête qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ma_table.ma_colonne
    FROM ma_table
    ORDER BY CAST(LEFT(ma_colonne, INSTR(ma_colonne,' ')) AS INT);

  3. #3
    Membre Expert
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Par défaut
    Sauf que convertir TOTAL en int...

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    En ajoutant un CASE dans ORDER BY pour tester si le mot extrait est numérique ou alphabétique.

    Comment ?
    1001 / 1001 = 1
    TOTAL / TOTAL = NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ma_table.ma_colonne
    FROM ma_table
    ORDER BY CASE 
      WHEN CAST(LEFT(ma_colonne, INSTR(ma_colonne,' ')) AS INT) / CAST(LEFT(ma_colonne, INSTR(ma_colonne,' ')) AS INT) IS NOT NULL THEN CAST(LEFT(ma_colonne, INSTR(ma_colonne,' ')) AS INT)
    END, ma_colonne;
    A essayer ou adapter.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre émérite Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Par défaut
    Merci pour vos réponses.

    gregf37,
    MySQL n'aime pas beaucoup le INT
    SELECT *
    FROM ma_table
    ORDER BY CAST( LEFT( ma_colonne, INSTR( ma_colonne, ' ' ) ) AS INT )

    MySQL a répondu :
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INT)' at line 2
    Cinephil,
    MySQL n'aime toujours pas le INT :
    SELECT *
    FROM ma_table
    ORDER BY
    CASE
    WHEN CAST( LEFT( ma_colonne, INSTR( ma_colonne, ' ' ) ) AS INT ) / CAST( LEFT( ma_colonne, INSTR( ma_colonne, ' ' ) ) AS INT ) IS NOT NULL
    THEN CAST( LEFT( ma_colonne, INSTR( ma_colonne, ' ' ) ) AS INT )
    END , ma_colonne

    MySQL a répondu :
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INT) / CAST(LEFT(nom_long, INSTR(nom_long,' ')) AS INT) IS NOT NULL THEN CAST(LE' at line 3

    apres une petite recherche, la syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     CAST(expr AS type), CONVERT(expr,type), CONVERT(expr USING transcoding_name)
     
    Les fonctions CAST() et CONVERT() peuvent être utilisées pour convertir une donnée d'un type en un autre. Leurs syntaxes sont :
     
    La valeur de type peut être l'une des suivantes :
     
        *
     
          BINARY
        *
     
          CHAR
        *
     
          DATE
        *
     
          DATETIME
        *
     
          SIGNED {INTEGER}
        *
     
          TIME
        *
     
          UNSIGNED {INTEGER}
    Donc, il faut utiliser "SIGNED" ou "UNSIGNED".

    Ca a l'air mieux.
    Je regarde en détail et je vous tiens au courant.
    Merci !

  6. #6
    Membre émérite Avatar de sebhm
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    1 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 090
    Par défaut
    Nickel !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $query = "SELECT * FROM ma_table
              ORDER BY 
              CASE 
                WHEN 
                  CAST(LEFT(ma_colonne, INSTR(ma_colonne,' ')) AS UNSIGNED) / CAST(LEFT(ma_colonne, INSTR(ma_colonne,' ')) AS UNSIGNED) IS NOT NULL 
                    THEN CAST(LEFT(ma_colonne, INSTR(ma_colonne' ')) AS UNSIGNED)
                END, 
                ma_colonne";
    merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer une sous-chaine selon une longueur définie
    Par arnovodao dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 12/10/2012, 17h20
  2. Réponses: 2
    Dernier message: 04/06/2010, 08h27
  3. Recherche une sous-chaine dans un champ ?
    Par nerick dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/03/2006, 13h46
  4. Réponses: 5
    Dernier message: 24/02/2006, 10h12
  5. Rechercher une sous chaine dans une chaine
    Par Oluha dans le forum ASP
    Réponses: 4
    Dernier message: 03/02/2005, 14h39

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