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 :

Requête SELECT SUBSTRING


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 414
    Points : 187
    Points
    187
    Par défaut Requête SELECT SUBSTRING
    Bonsoir à tous,
    Cet après-midi je patauge sur une requête MySQL :
    Je souhaite sélectionner une substring dans chaque colonne d’une table, je n’ai pas accès à JSON_Extract la version utilisée de MYSQL est 5.6.5.
    La structure des colonnes de la table sont les suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    col1 => [fr_fr], “bla-bla1 fr“, [en_us],*“bla-bla1 en“, [de_de], “bla1-bla de“ …
    col2 => [fr_fr], “blo2-blo fr“, [en_us],*“blo2-blo en“, [de_de], “blo2-blo de“ …
    col3 => [fr_fr], “bli3-bli fr“, [en_us],*“bli3-bli  en“, [de_de], “bli3-bli  de“ …
    col4…
    Je souhaite faire une requête pour sélectionner dans toutes les colonnes de la table une substring, par exemple, [en_us], “…“ Je n’ai pas la moindre idée de comment faire ceci simplement et peut-on faire ça simplement ! Je précise qu’il s’agit d’une requête ou WHERE id = valeur fixe !

    D'avance merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Vu la modélisation de la table (très discutable d'ailleurs), tu n'as pas le choix: tu dois traiter toutes les colonnes concernées.

    Par contre je n'ai pas très bien compris: tu veux extraire une sous-chaine sans en connaître la position dans la colonne, ou tu veux sélectionner toutes les lignes dont au moins une colonne contient la chaine en question ?

    Pour trouver la position d'une chaine dans une autre, il faut utiliser LOCATE().
    Et pour extraire une chaine depuis une autre, tu as SUBSTR() ou SUBSTRING_INDEX().

    Reste maintenant à le faire sur toutes les colonnes.

    Tatayo.

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 064
    Points
    19 064
    Par défaut
    Salut à tous.

    Citation Envoyé par bronon
    La structure des colonnes de la table sont les suivantes :
    Il y a trop de répétitons dans une même colonne et pire encore, il y a trop de colonnes stockant le même type d'information.

    Je vous conseille de créer une table fille contenant :
    --> un identifiant
    --> une colonne contenant 1 seule information de type pays.

    Dans une table associative, vous stockez d'une part l'identifiant de votre table mère, et les identifiants de votre table fille.

    Pour la recherche d'une chaîne de caractères, en l'occurrence un pays, voici un exemple :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    --------------
    START TRANSACTION
    --------------
     
    --------------
    set session collation_connection = "latin1_general_ci"
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `fille`
    --------------
     
    --------------
    CREATE TABLE `fille`
    ( `id`    integer unsigned  NOT NULL auto_increment primary key,
      `pays`  varchar(255)      NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `fille` (`pays`) VALUES
      ('[fr_fr]'),
      ('[en_us]'),
      ('[de_de]')
    --------------
     
    --------------
    select * from `fille`
    --------------
     
    +----+---------+
    | id | pays    |
    +----+---------+
    |  1 | [fr_fr] |
    |  2 | [en_us] |
    |  3 | [de_de] |
    +----+---------+
    --------------
    DROP TABLE IF EXISTS `mere`
    --------------
     
    --------------
    CREATE TABLE `mere`
    ( `id`    integer unsigned  NOT NULL auto_increment primary key,
      `lib`   varchar(255)      NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `mere` (`lib`) VALUES
      ('Un'),('Deux'),('Trois')
    --------------
     
    --------------
    select * from `mere`
    --------------
     
    +----+-------+
    | id | lib   |
    +----+-------+
    |  1 | Un    |
    |  2 | Deux  |
    |  3 | Trois |
    +----+-------+
    --------------
    DROP TABLE IF EXISTS `assoc`
    --------------
     
    --------------
    CREATE TABLE `assoc`
    ( `id`          integer unsigned  NOT NULL auto_increment primary key,
      `clef_mere`   integer unsigned  NOT NULL,
      `clef_fille`  integer unsigned  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `assoc` (`clef_mere`,`clef_fille`) VALUES
      (1,1),(1,2),(2,3),(3,2),(3,3)
    --------------
     
    --------------
    select * from `assoc`
    --------------
     
    +----+-----------+------------+
    | id | clef_mere | clef_fille |
    +----+-----------+------------+
    |  1 |         1 |          1 |
    |  2 |         1 |          2 |
    |  3 |         2 |          3 |
    |  4 |         3 |          2 |
    |  5 |         3 |          3 |
    +----+-----------+------------+
    --------------
    SELECT *
      FROM `assoc` as t1
     
    INNER JOIN   `fille` as t2
            ON  t2.id = t1.clef_fille
     
    INNER JOIN  `mere` as t3
            ON  t3.id = t1.clef_mere
     
         WHERE  t2.pays = '[en_us]'
    --------------
     
    +----+-----------+------------+----+---------+----+-------+
    | id | clef_mere | clef_fille | id | pays    | id | lib   |
    +----+-----------+------------+----+---------+----+-------+
    |  2 |         1 |          2 |  2 | [en_us] |  1 | Un    |
    |  4 |         3 |          2 |  2 | [en_us] |  3 | Trois |
    +----+-----------+------------+----+---------+----+-------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Vous constatez que la recherche est fort simple.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Membre confirmé Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Points : 487
    Points
    487
    Par défaut
    Bonjour bronon,

    J'essaie de mieux comprendre votre besoin.

    Si j'ai bien compris :

    • vous recevez un flux JSON avec, pour chaque élément d'information, sa traduction en différentes langues,

    • Chacun des éléments d'information, traduit dans les différentes langues, est inséré dans des colonnes consécutives,

    • Au final la table ne comprend qu'une ligne...


    Cette approche me semble pour le moins bizarre…
    Pourquoi ne pas placer les éléments d'informations en ligne(s), chacune représentant une même information rédigée en différentes langues ?

    Avec une telle approche le problème serait vite réglé dans une approche plus relationnelle. Ce pourquoi MySQL est fait….

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 414
    Points : 187
    Points
    187
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Merci pour ton retour.
    C aussi la seule solution que j'avais trouvé, sinon il existe une solution rapide et efficace avec JSON_EXTRACT via mysql 8.0+ mais ce n'ai pas possible dans ce cas

    Citation Envoyé par isabelle.letrong Voir le message
    Merci pour ton retour, +sieurs personne me conseillent cette manière de faire, je réfléchi à remettre mon process en question !

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 064
    Points
    19 064
    Par défaut
    Salut à tous.

    Votre problème est la modélisation de ce que vous cherchez à faire. Je vous conseille de suivre mon exemple.
    Mais vu le peu d'information que vous nous avez communiquez, il nous est difficile de vous conseiller sur la bonne marche à suivre.

    Pour le remplissage, je n'ai pas compris ce que vous faites.
    Par exemple, cette valeur : "[fr_fr], “bla-bla1 fr“, correspond à l'identification de la langue, suivi du texte. Est-ce bien cela ?

    Dans mon exemple, il suffit de modifier la table fille et d'ajouter la colonne "text".
    Vous aurez la possibilité de sélectionner par la colonne "pays" (en fait la langue) pour obtenir votre sélection.

    Il n'y a aucune raison de passer par "JSON_EXTRACT" via mysql 8.0+, puisque vous êtes sous mysql 5.6.5.
    A partir du plux JSON, vous devez répartir vos données dans les bonnes colonnes et construire les liens entre les différentes tables.

    Je rappelle que mysql gère une base de données de type relationnelle, et non des fichiers plats.
    C'est-à-vous de renseigner les liens dont vous avez besoin pour créer les relations entre vos différentes données.

    Citation Envoyé par bronon
    +sieurs personne me conseillent cette manière de faire,
    Mauvais conseille.

    Citation Envoyé par bronon
    je réfléchi à remettre mon process en question !
    C'est pour cela que vous êtes venu dans ce forum, nous soumettre votre problème.

    La solution est de revoir la modélisation !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Résultat commençant par un chiffre avec requête SELECT
    Par nicolas.pissard dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/04/2010, 13h31
  2. [MySQL] la requête SELECT SUBSTR
    Par kilkikou dans le forum PHP & Base de données
    Réponses: 33
    Dernier message: 08/06/2006, 22h15
  3. Insertion multiple à base de sous requête SELECT
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2005, 16h34
  4. SQL Server 7.0 - Requête Select
    Par sangokus dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/03/2004, 10h32
  5. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 13h23

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