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

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 210
    Points : 91
    Points
    91
    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 émérite
    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
    Points : 2 522
    Points
    2 522
    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 : 109
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
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

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

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 210
    Points : 91
    Points
    91
    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 émérite
    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
    Points : 2 522
    Points
    2 522
    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.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 210
    Points : 91
    Points
    91
    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

  7. #7
    Membre émérite
    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
    Points : 2 522
    Points
    2 522
    Par défaut
    Ils ne font pas bon ménage parce qu’ils ne sont pas faits pour travailler ensemble.
    Que veux-tu faire exactement ?
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 210
    Points : 91
    Points
    91
    Par défaut
    Bonjour,

    Toujours dans ma recherche de séquence, j'arrive à une limite de cette technique. Voici l'erreur :

    #1116 - Trop de tables. MariaDB ne peut utiliser que 61 tables dans un JOIN

    Effectivement, je recherche des séquences avec plusieurs milliers de ligne qui se suivent.

  9. #9
    Membre émérite
    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
    Points : 2 522
    Points
    2 522
    Par défaut
    Faut peut-être voir avec un autre système de gestion de bases de données. En tous cas il y aura toujours une limite.
    Cela ne sert à rien d'optimiser quelque chose qui ne fonctionne pas.

    Mon site : www.emmella.fr

    Je recherche le manuel de l'Olivetti Logos 80B.

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