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 :

Récupérer les 8 caractères à gauche du 3ème séparateur [MySQL-5.1]


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut Récupérer les 8 caractères à gauche du 3ème séparateur
    Bonjour à vous,

    Je me casse les dents sur un problème simple sur le papier, facile à résoudre en PHP mais en SQL c'est plus compliqué pour moi...

    J'ai une table 'entreprises' qui stocke diverses informations dont le champs 'machine1' qui correspond à une chaine qui stocke elle-même diverses informations séparées par un '|'

    Ex : LM215|1|20130401|1|20130401|Prestataire

    Je souhaite récupérer la chaine en gras, c'est à dire les 8 caractères (date) à gauche du 3ème séparateur : ouf !

    Je précise que je suis en phase de test sur l'espace ftp Free avec PhpMyAdmin 5.1.61 et que les procédures stockées semblent compliquées voire impossible (une histoire de délimiteur...)

    Il y a ce topic avec un requête de ouf qui semble se rapprocher de mon problème (pas la 2) :
    http://stackoverflow.com/questions/5...ar-using-t-sql

    Merci de m'aider, j'ai le cerveau en compote !

    Cordialement,
    Guillaume

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    SUBSTRING_INDEX pour récupérer et découper la chaine entre le 2eme et 3eme |
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    mysql> select SUBSTRING_INDEX(SUBSTRING_INDEX(c,'|',3),'|',-1) as dte
        ->   from (select 'LM215|1|20130401|1|20130401|Prestataire' as c) t;
    +----------+
    | dte      |
    +----------+
    | 20130401 |
    +----------+
    1 row in set (0.00 sec)
    Pour info stocker des données concaténées de la sorte dans une colonne n'est pas conforme à la 1ere forme normale, ce qui oblige ce genre de bidouille.

    Pour ce qui est du delimiteur, il suffit de le changer pour pouvoir créer des procédures stockeés :
    http://dev.mysql.com/doc/refman/5.0/...procedure.html

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut On y est presque...
    Tout d'abord, merci skuatamad !

    Effectivement, j'ai testé et ça fonctionne. Par contre, je me suis peut-être mal exprimé mais ce que je recherche est un poil plus compliqué, en espérant que cela soit possible. Je m'explique :

    Table 'entreprises'

    Id,champs2,champs3,...,machine1,....champsN

    'machine1' contient par exemple : LM215|1|20130401|1|20130401|Prestataire

    Mais il y a plein d'enregistrements ! La finalité est un tri décroissant sur la 'colonne' extraite par ta solution.

    Ex :
    LM215|1|20130401|1|20130401|Prestataire1
    PM255|1|20120612|1|20130401|Prestataire2
    RM389|1|20131024|1|20130401|Prestataire3

    Résultat souhaité :
    RM389|1|20131024|1|20130401|Prestataire3
    LM215|1|20130401|1|20130401|Prestataire1
    PM255|1|20120612|1|20130401|Prestataire2

    Donc la chaine doit être remplacée par tous les champs 'machine1' de la table 'entreprises'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(c,'|',3),'|',-1) AS date 
    FROM (SELECT machine1 AS c FROM entreprises) t 
    ORDER BY date DESC
    Fonctionne pas mal. Maintenant j'ai la colonne souhaitée. Mais il me faut tous les autres champs : où placer le 'SELECT *' ? Imbriquer à nouveau ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * FROM (
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(c,'|',3),'|',-1) AS date 
    FROM (SELECT machine1 AS c FROM entreprises) t 
    ORDER BY date DESC)
    renvoie "#1248 - Every derived table must have its own alias"

    Une idée ? Merci bcp !

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    La sous-requête c'était juste pour mon test, il faut utiliser SUBSTRING_INDEX directement sur la colonne de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT autre_champ,....,
           SUBSTRING_INDEX(SUBSTRING_INDEX(machine1,'|',3),'|',-1) AS dte
      FROM entreprises
     ORDER BY dte DESC

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    La sous-requête c'était juste pour mon test, il faut utiliser SUBSTRING_INDEX directement sur la colonne de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT autre_champ,....,
           SUBSTRING_INDEX(SUBSTRING_INDEX(machine1,'|',3),'|',-1) AS dte
      FROM entreprises
     ORDER BY dte DESC
    Oups effectivement... GRAND MERCI

    Il me semblait pourtant avoir essayé ça

    Le top c'est que la requête suivante fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *,SUBSTRING_INDEX(SUBSTRING_INDEX(machine1,'|',3),'|',-1) AS dte
    FROM entreprises
    ORDER BY dte DESC
    Encore merci !

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

Discussions similaires

  1. Récupérer les derniers caractères d'une ligne d'un fichier texte
    Par Laaris dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/01/2009, 16h06
  2. Récupérer les coordonnées (haut gauche) d'une cellule ou d'un div
    Par pcayrol dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 28/06/2007, 14h49
  3. Réponses: 6
    Dernier message: 08/08/2006, 09h14
  4. Comment récupérer les caractères accentués ?
    Par Sophy75 dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2006, 15h06
  5. Réponses: 2
    Dernier message: 14/06/2006, 09h30

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