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

PHP & Base de données Discussion :

Recherche d'une séquence


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Par défaut Recherche d'une séquence
    Bonjour à tous,

    Voici mon petit soucis que je simplifie.

    J'ai une base de donnée simple : ID et Lettre. ID est la clé autoincrémentée et dans lettre, j'ai une lettre (de "a" à "z").

    Ce qui donne par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    1=r
    2=z
    3=s
    ....
    753413=o
    ...
    7841312111=y
    Quel serait ma requête pour trouver les séquences, par exemple "a" directement suivit de "z" puis de "e" puis de "r" puis de "t" puis enfin de "y". Donc je veux trouver les différents ID qui commence par a suivit de "zerty"

    Dans mon code réel, la séquence peux être composé de plus de 500 "caractères" différents (un caractère étant une chaine de plus de 64 caractères).

    Merci

  2. #2
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Je ne sais pas si j'ai bien compris.

    L'idée est de constituer une requête SQL de manière dynamique en fonction de la recherche à faire. Il doit y avoir la possibilité de faire une requête récursive mais pas toutes les versions de mySql supportent.

    La fonction makeQuery crée la requête en fonction du paramètre recherche. J'ai mis des PHP_EOL pour que la requête soit facilement comprise quand elle est affichée. Ils peuvent être enlevés pour l'exécution via PHP.
    Le nl2br sert à convertir PHP_EOL en <br/> pour l'affichage.

    Je n'ai pas mis de code pour exécuter la requête. Pour mon test je l'ai copiée dans PhpMyAdmin.

    Code php : 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
    function makeQuery($recherche)
    {
     $longueur = strlen($recherche);
     $select   = "";
     $inner    = "";
     $where    = "";
     for ($i=1;$i<=$longueur;$i++)
     {
      // index suivant
      $next  = $i+1;   
      if ($next <= $longueur)
      {
       // caractère courant
       $char  = $recherche[$i]; 
       // select clause
       $select = $select . ", t$next.id as \"$char\"";
       // inner clause 
       $pt1   = "inner join toto t$next on t$i.id+1= t$next.id and t$next.l='$char'";
       $inner = $inner . $pt1 . PHP_EOL;
      } 
     }
        $char  = $recherche[0];
     $query = "select t1.id as \"$char\" $select from toto t1 " . PHP_EOL . $inner . " WHERE  t1.l ='$char'" . PHP_EOL . $where;
     return $query;
    }
     
    print nl2br(makeQuery("azerty"));


    Donne :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select t1.id as "a" , t2.id as "z", t3.id as "e", t4.id as "r", t5.id as "t", t6.id as "y" from toto t1 
     inner join toto t2 on t1.id+1= t2.id and t2.l='z'
     inner join toto t3 on t2.id+1= t3.id and t3.l='e'
     inner join toto t4 on t3.id+1= t4.id and t4.l='r'
     inner join toto t5 on t4.id+1= t5.id and t5.l='t'
     inner join toto t6 on t5.id+1= t6.id and t6.l='y'
     WHERE  t1.l ='a'

    Résultat dans PhpMyAdmin :
    Nom : Capture20181030001.JPG
Affichages : 118
Taille : 12,7 Ko

    Table et données
    . La table s'appelle toto et les champs id et l.
    Fichiers attachés Fichiers attachés

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Par défaut
    C'est tout à fait ce que je voulais. Merciiiiiiiiiiiiii

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Par défaut
    Bonjour,

    Le code SQL suivant fonctionne parfaitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select t1.id as "a" , t2.id as "z", t3.id as "e", t4.id as "r", t5.id as "t", t6.id as "y" from toto t1 
     inner join toto t2 on t1.id+1= t2.id and t2.l='z'
     inner join toto t3 on t2.id+1= t3.id and t3.l='e'
     inner join toto t4 on t3.id+1= t4.id and t4.l='r'
     inner join toto t5 on t4.id+1= t5.id and t5.l='t'
     inner join toto t6 on t5.id+1= t6.id and t6.l='y'
     WHERE  t1.l ='a'
    Par contre, je n'arrive pas à faire un UPDATE.

    J'ai ajouté une colonne "nom". Comment faire pour y indiquer, par exemple, "X", à coté des lettres a-z-e-r-t-y ?
    toto2.sql

    Merci

  5. #5
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Je ne comprends pas le point sur l’update.

    Pour avoir X il suffit de l’ajouter dans le paramètre de makeQuery.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    211
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 211
    Par défaut
    A vrai dire, j'ai essayé le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE toto SET nom="X" t1 
     inner join toto t2 on t1.id+1= t2.id and t2.l='z'
     inner join toto t3 on t2.id+1= t3.id and t3.l='e'
     inner join toto t4 on t3.id+1= t4.id and t4.l='r'
     inner join toto t5 on t4.id+1= t5.id and t5.l='t'
     inner join toto t6 on t5.id+1= t6.id and t6.l='y'
     WHERE  t1.l ='a'
    Malheureusement, cela ne fonctionne pas. D'après ce que j'ai trouvé, Update et Inner join ne font pas bon ménage

Discussions similaires

  1. sed : recherche d'une séquence particulière
    Par Gyslain dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 22/11/2009, 10h27
  2. recherche dans une séquence avec plusieurs prédicats
    Par Alain Defrance dans le forum JavaFX
    Réponses: 5
    Dernier message: 27/09/2009, 09h54
  3. Recherche de mots dans une séquence très longue
    Par Jasmine80 dans le forum Langage
    Réponses: 0
    Dernier message: 21/12/2007, 10h52
  4. Réponses: 2
    Dernier message: 08/06/2007, 10h18
  5. Recherche d'une séquence sonore dans une base de données
    Par DELPIE dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 15/09/2006, 21h24

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