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 :

Incrémenter une sous-chaine le plus efficacement possible ? [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut Incrémenter une sous-chaine le plus efficacement possible ?
    bonsoir,

    je sollicite votre sagacité pour m'indiquer s'il existe une façon très simple et optimisée d'incrémenter une sous-chaine. Je m'explique avec un exemple ça sera bien plus facile !!

    Donc soit, une rubrique d'une table qui contient des chaines de ce type :

    01-01-01
    01-01-02
    01-02-01
    01-02-02
    01-02-03
    01-03-
    02-01-01
    02-01-02
    02-02-
    02-03-01
    02-03-02

    (en gros ça représente une sorte de plan : grand I/A/1. Donc dans le grand I on a un A et un B, le A contient 01 et 02 et le B 01,02,03... OK ?)

    je souhaiterais pouvoir "insérer" dans ce plan une sous-rubrique et donc décaller les suivantes ! Ainsi insérer derrière 01-02-01 une rubrique... donc :
    01-02-02 -> 01-02-03
    01-02-03 -> 01-02-04

    et les autres ne bougent pas...

    En gros ça revient à dire que pour tous les enregistrements dont le numéro de niveau est supérieur à un numéro donné, il faut incrémenter de 1 ! (vous me suivez toujours ?? Wink )

    Sachant qu'ici c'est le dernier numéro qui est incrémenté, mais ça pourrait être : j'insère une sous-rubrique derrière 01-01 donc
    01-02-* --> 01-03-*
    01-03-* --> 01-04-*

    VOilà !! J'avoue qu'à part en m'embarquant dans des boucles php qui ne me paraissent pas du meilleur goût, j'ai un peu de mal à apréhender ce problème ! Embarassed Si on pouvait dire sous forme d'une requête mysql :
    pour tous les enregistrement supérieurs répondant à ce format "01-[0-9]{2}.*" on incrémente la sous-chaine 2 (ou 3 ou 4), j'avoue que ça m'arrangerait ! mais là je suis largué !!

    Merci d'avance pour votre aide !

  2. #2
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    bon pour l'instant j'en suis à qqe chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE rubriques
       SET num=CONCAT(SUBSTRING(num FROM 1 FOR 3),SUBSTRING(num FROM 4 FOR 2)+1,SUBSTRING(num FROM 6))
     WHERE num REGEXP '^01\-' 
       AND SUBSTRING(num FROM 4 FOR 2) > 01
    où les chiffres des substring pourraient bien sûr être issue d'un calcul préalable, ainsi que mon REGEXP. Ce truc fait presque ce que je veux, mais il me formate mes sous-chaine (01 02 03) à un seul chiffre (1 2 3). Ex. : 01-02-02 devient 01-3-02.

  3. #3
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Quel SGBD / version please ?

    Merci de respecter ceci : Conseils à lire avant de poster
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  4. #4
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    oops en effet je ne l'ai pas indiqué... c'est pour MySQL. Version "variable". En ce moment, je teste sur en local sur un easyphp 1.8 avec la version sql installée avec (4.1.9-max).
    Mais ce script sera utilisé sur un site chez free (qui en ce moment tourne avec ça : MySQL 5.0.22-nightly-20060515-debug) et chez OVH (temporairement car ensuite ce sera un serveur autre dont je ne connais pas encore la version mysql) . Pour OVH, je n'ai pas la version sous la main tout de suite, je tâcherais d'y penser à midi...


    merci

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    bon je me réponds encore à moi

    Voici un bout de code qui ferait presque ce que je veux. Pour la sélection c'est compètement OK ça me sélectionne bien ce que je veux... A savoir que pour sélectionner toutes les rubriques (et leurs sous-rubriques) suivant 01-01 ça fonctionne.

    En revanche pour la modif, le LPAD semble ne pas fonctionner ? Est-ce que cette fonction est autorisée en UPDATE ? est-ce qu'elle peut être appelée à l'intérieure d'un CONCAT ? bref, où est ma couille et comment je peux conserver automatique mon format sur 2 chiffres après incrémentation ?? (à savoir que sans le LPAD ça fonctionne tip-top mais ça m'écrit "01-3-01" à la place de "01-03-01" par exemple...

    siouuu plait aidez moi les bigs spécialistes SQL (moi je suis newbie et je découvre toutes ces fonctions ! Jusqu'ici je ne faisais guère que qqes requête type SELECT INSERT UPDATE de façon très simple et sans appel à aucune autre fonction à l'intérieur !

    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
     
    $rub="01-01";
    $rub_racine=substr($rub,0,-2);
    $rub_testee=substr($rub,-2);
    $pos=strlen($rub_racine);
     
    $req_rub=mysql_query("
    	SELECT id,num,titre, SUBSTRING(num FROM 1 FOR $pos) as numd, SUBSTRING(num FROM $pos+1 FOR 2) as numf
    	FROM rubriques
    	WHERE num REGEXP '^01\-' AND SUBSTRING(num FROM $pos+1 FOR 2)>01
    	ORDER BY num
    	");
    while($enr=mysql_fetch_array($req_rub)) {
    	echo sprintf("%s (d%s,f%s) -> %s",$enr['num'],$enr['numd'],$enr['numf'],$enr['titre'])."<br>";
    }
     
     
    $req_rub=mysql_query("
    	UPDATE rubriques
    		SET num=CONCAT(SUBSTRING(num FROM 1 FOR $pos),LPAD(SUBSTRING(num FROM $pos+1 FOR 2)+1,2,'0'),SUBSTRING(num FROM $pos+3))
    		WHERE num REGEXP '^01\-' AND SUBSTRING(num FROM $pos+1 FOR 2)>01
    	");
     
    echo mysql_affected_rows()

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    bon mon enquête avance... C'est le chiffre "0" qui semble me poser problème, si j'utilise le LPAD avec un 'A' par exemple ça roule ???

    quelle est donc l'astuce avec le 0 ?? (si je mets \0 c'est encore pire...)

  7. #7
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Il y a plus de PHP que de SQL, je déplace donc ici car je pense que cette question y sera mieux traitée
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    en fait j'ai finis par trouver ma réponse ! Et c'est pas le 0 qui posait problème mais les simples quotes à la place de double quote pour SUBSTRING() !
    Il fallait donc que j'écrive :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $rub="01-01";
    $rub_racine=substr($rub,0,-2);
    $rub_testee=substr($rub,-2);
    $pos=strlen($rub_racine);
     
    $req_rub=mysql_query("
    	UPDATE rubriques
    		SET num=CONCAT(SUBSTRING(num FROM 1 FOR $pos),LPAD(SUBSTRING(num FROM $pos+1 FOR 2)+1,2,\"0\"),SUBSTRING(num FROM $pos+3))
    		WHERE num REGEXP '^01\-' AND SUBSTRING(num FROM $pos+1 FOR 2)>01
    	");
     
    echo mysql_affected_rows()
    indirectement merci quand même, car le fait d'avoir besoin d'expliquer ce que je cherchais m'a sûrement permis de mieux apréhender ma question et surtout mes recherches m'ont amener à dévouvrir ce forum...

    à+

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

Discussions similaires

  1. [RegEx] Remplacer une sous-chaine par une expression incrémentée
    Par krunch dans le forum Langage
    Réponses: 5
    Dernier message: 18/02/2013, 10h23
  2. Recherche une sous-chaine dans un champ ?
    Par nerick dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/03/2006, 13h46
  3. je cherche une sous chaine dans une chaine
    Par avprive dans le forum C++
    Réponses: 3
    Dernier message: 17/03/2005, 01h48
  4. Rechercher une sous chaine dans une chaine
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/02/2005, 10h36
  5. Rechercher une sous chaine dans une chaine
    Par Oluha dans le forum ASP
    Réponses: 4
    Dernier message: 03/02/2005, 14h39

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