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

Langage SQL Discussion :

[MySQL 5+] Sélection d'un ensemble de mots, quelque soit l'ordre


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut [MySQL 5+] Sélection d'un ensemble de mots, quelque soit l'ordre
    [db : MySQL 5+]

    Bonjour,

    Je cherche à faire une requête qui sélectionnerait les champs contenant les mêmes mots que dans un autre champ, dans le même ordre ou un autre ordre.

    Exemple :

    Table 1, champ a :
    1: lapin vert
    2: chaton rouge

    Table 2, champ b :
    1: rouge chaton
    2: Vert lapin
    3: rouge chaton doré

    Y'a t'il un moyen de formuler un SELECT qui trouverait une correspondance entre a1 et b2, et entre a2 et b1 uniquement ?
    Ca me paraît être impossible mais sait-on jamais...

    Sinon, y'a t'il un moyen de formuler une requête qui trouverait une correspondance entre a1 et b2, a2 et b1, a2 et b3 ?
    C'est à dire, capable de trouver les mots de b.n dans a.n, même partiellement à la manière des LIKE %mot% ?

    Ce qui donnerait un équivalent de
    b LIKE %lapin% AND b LIKE %vert%
    b LIKE %chaton% AND b LIKE %rouge%
    etc., en une seule requête ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    Il faut implémenter une indexation textuelle pour faire cela.
    Soit votre SGBDR l'incorpore, comme Full Text Search pour Microsoft SQL Server, soit vous pouvez le réaliser de toutes pièces.

    Lisez l'article que j'ai écrit à ce sujet : http://sqlpro.developpez.com/cours/indextextuelle/

    A +

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci pour le lien mais ça ne répond pas à mon problème.
    J'ai environ 10.000 expressions de référence d'un coté et 100.000 de l'autre, je ne peux pas faire 100.000 SELECT, ce serait d'une lourdeur monstrueuse.

    Il y aurait peut-être une solution avec des prod stocks et/ou regexp mais c'est là où je coince



    Hors sujet :
    SQLServer ne gère pas les insertions multiples ? Dans votre article, les
    insert into MOTS_NOIRS (MOT_NOIR) values ('a')
    insert into MOTS_NOIRS (MOT_NOIR) values ('assez')
    insert into MOTS_NOIRS (MOT_NOIR) values ('au')
    (...)
    paraissent aussi très lourds comparé à
    insert into MOTS_NOIRS (MOT_NOIR) values ('a'),('assez'),('au') [,...]

    P.S. : ah si, depuis la version 2008... incroyable. MS Power
    http://blog.sqlauthority.com/2008/07...w-constructor/

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 902
    Points : 51 646
    Points
    51 646
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    insert into MOTS_NOIRS (MOT_NOIR) values ('a')
    insert into MOTS_NOIRS (MOT_NOIR) values ('assez')
    insert into MOTS_NOIRS (MOT_NOIR) values ('au')
    (...)
     
    insert into MOTS_NOIRS (MOT_NOIR) values ('a'),('assez'),('au')
    L'un comme l'autre sont une seule transaction. Donjc l'effort pour le moteur est le même. Seul avantage pour la seconde solution : cela réduit le flux d'octets vers le serveur. Mais il est préférable de faire cela sous forme d'insertion de fichier texte.

    Pour en revenir à votre problème, je ne voit pas d'autre solution que l'indexation textuelle pour répondre à votre problème. Néanmoins, si vous en trouvez une, pensez à la faire breveter !

    A +

  5. #5
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Pour info, MySQL implémente la recherche FULL-TEXT, cf notamment http://omiossec.developpez.com/mysql/fulltext/.

    Néanmoins, l'opérande de comparaison doit être une constante texte, donc ça ne marchera pas dans ce cas. Bricoler une indexation des mots comme celle de SQLpro me semble effectivement la seule solution. Au final, cela permettra de faire une jointure du genre :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    FROM table1 T1
      INNER JOIN `INDEX` I1 ON I1.txt_id = T1.id
      INNER JOIN `INDEX` I2 ON I1.mot_id = I2.mot_id 
      INNER JOIN table2 T2 ON I2.txt_id = T2.id
    (Je simplifie en supposant les ID de T1 et T2 soient distinctes les unes des autres.)

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Autre suggestion : un peu de PHP...

    Créer une table tmp qui accueillera les id de la table1 et les mots de la colonneA

    Récupérer l'ensemble des valeurs de table1.colonneA et l'id

    Pour chaque ligne récupérée
    Affecter l'id à une variable
    exploder la colonneA pour la séparer en mots
    Pour chaque mot de colonneA
    Construire requête INSERT dans la table tmp avec l'id et le mot
    Exécuter la requête
    Fin chaque mot
    Fin chaque ligne

    Faire pareil avec la table2
    Il est maintenant possible de chercher les points communs entre les deux tables.

    Autre solution : tout faire avec des tableaux PHP

Discussions similaires

  1. [XL-2010] Problème de sélection de l'ensemble des lignes d'un listview
    Par juju05 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 04/03/2014, 16h12
  2. Sélection des syllabes d'un mot
    Par floflowian dans le forum Word
    Réponses: 1
    Dernier message: 20/07/2011, 23h36
  3. Expreg recherche d'un ensemble de mots
    Par Jasmine80 dans le forum Langage
    Réponses: 4
    Dernier message: 01/06/2007, 18h31
  4. [Mysql 3]Sélection des 2 MAX
    Par tyx dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/03/2007, 10h36
  5. [langage] exp reg: recherche mot ou ensemble de mot
    Par eautret dans le forum Langage
    Réponses: 5
    Dernier message: 14/12/2004, 17h25

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