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 :

Trouver occurrences de table1.champ1 dans table2.champ2 avec regexp


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2002
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2002
    Messages : 30
    Points : 27
    Points
    27
    Par défaut Trouver occurrences de table1.champ1 dans table2.champ2 avec regexp
    Bonjour,

    Pour mon problème je vais prendre une situation hypothétique.

    Soit:
    Une table "mots" contenant 100 000 entrées (mots du dictionnaire)
    Une table "noms" contenant 400 000 entrées (noms de familles)

    Je souhaite trouver toutes les occurrences de:
    noms.nom REGEXP '^[a-z]?(mots.mot)[a-z]?$'

    En clair, je cherche à trouver tous les noms de familles contenant un mot du dictionnaire à 2 lettre près.

    Je tiens à utiliser regexp car j'ai simplifié la situation ici... En réalité la regexp est plus complexe.

    Il faudra ensuite que j'insère les résultats dans une 3ème table, donc si ca peut être fait par mysql plutot qu'avec une boucle php c'est encore mieux!

    La seule solution que j'ai trouvée travaille au niveau du script PHP:
    SELECT * mots.mot puis une boucle for each, SELECT * where noms.nom REGEXP '^[a-z]?($data['mot'])[a-z]?$'
    Mais inutile de dire que c'est très très lourd !!!

    Des idées sur le problème?

    J'utilise MySQL 3.23.1 mais si il faut que je mette à jour MySQL pour régler ce problème, je suis prêt à le faire.

    Merci d'avance,
    Romain

  2. #2
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2002
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2002
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    Est-ce impossible à faire? Trop simple ? Ce forum est très peu visité? Personne ne sait ? :'(

  3. #3
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Citation Envoyé par kakou
    Mais inutile de dire que c'est très très lourd !!!
    Pourquoi ? Peux-tu préciser ?
    Pensez au bouton

  4. #4
    Nouveau membre du Club
    Étudiant
    Inscrit en
    Octobre 2002
    Messages
    30
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2002
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    Eh bien ma boucle envoie 100 000 fois la requète:

    SELECT * where noms.nom REGEXP '^[a-z]?($data['mot'])[a-z]?$'

    C'est très lourd, d'une part à cause du nombre de requètes, mais d'autre part à cause de la requète elle même: regexp dans une base de 400 000 entrées
    non?

    En fait je voulais savoir si il n'y avait pas des fonctions mysql permettant de comparer 2 tables plus facilement en les joignant ou je ne sais quoi. En fait je ne suis pas expert en MySQL, c'est pourquoi je me posais la question


    J'ai également pensé que je pourrais modifier mon script afin de coupler les requètes par 5 en utilisant des OR mais ca me ferait toujours 20 000 requètes encore plus lourdes à envoyer, non?
    ex: 20 000 fois ça dans une base de 400 000 entrées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SELECT * where (noms.nom REGEXP '^[a-z]?(mot1)[a-z]?$' OR noms.nom REGEXP '^[a-z]?(mot2)[a-z]?$') OR noms.nom REGEXP '^[a-z]?(mot3)[a-z]?$' OR noms.nom REGEXP '^[a-z]?(mot4)[a-z]?$' OR noms.nom REGEXP '^[a-z]?(mot5)[a-z]?$')
    Merci

  5. #5
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    OK j'avais pas compris

    Tu peux utiliser une jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM noms INNER JOIN mots
    WHERE noms.nom REGEXP CONCAT('^[a-z]?(', mots.mot, ')[a-z]?$')
    (En croisant les doigts pour que le CONCAT marche avec REGEXP et que les index sur les tables seront pris en compte, sinon ça va ramer)

    Cf http://cyberzoide.developpez.com/php4/mysql/ pour les jointures
    Pensez au bouton

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

Discussions similaires

  1. Trouver la list des element dans un menu avec webdriver
    Par stpaul04 dans le forum Tests et Performance
    Réponses: 2
    Dernier message: 17/07/2014, 22h19
  2. Réponses: 0
    Dernier message: 31/05/2011, 18h58
  3. delete from table1 where rien dans table2
    Par tofito dans le forum Débuter
    Réponses: 3
    Dernier message: 03/12/2009, 17h14
  4. transfert du table1 vers table2 avec decoupage table2.champ2
    Par oscar.cesar dans le forum VBA Access
    Réponses: 7
    Dernier message: 23/10/2007, 06h10
  5. occurrence d'un mot dans un fichier
    Par vallytiana dans le forum Langage
    Réponses: 10
    Dernier message: 18/01/2006, 17h10

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