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

Schéma Discussion :

Représenter une hiérarchie (arbre) en base [MPD]


Sujet :

Schéma

  1. #21
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    Dans un premier temps, si le programme n'a pas la valeur de chemin, il faut la sélectionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select path from Comments where comment_id = 7;
    => et la stocker dans une variable. Puis, ici en syntaxe PHP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = 'SELECT * FROM Comments WHERE ' . $cn->quote($thePath) . ' LIKE path || \'%\'';
    Mais si le programme manipule le nœud 7, il dispose probablement déjà de la valeur du chemin dans une variable.

  2. #22
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    ... hum...

    Prenons les choses dans l'autre sens : comment ferais-tu pour rechercher l'ensemble des enfants du 4 sans savoir, a priori, que 4 est l'enfant de 1 ?
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  3. #23
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    L'ensemble des enfants : à mon avis la clé étrangère d'adjacence est vraiment nécessaire.

    L'ensemble des descendants :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $id = 4;
    $row = $cn->query('SELECT path FROM Comments WHERE comment_id = ' . $id)->fetch();
    $path = $row[0];
    $descendants = $cn->query('SELECT path FROM Comments WHERE path LIKE ' . $cn->quote($path . '%'))->fetchAll();

  4. #24
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Laffreuxthomas,

    Désolé, je ne maîtrise pas le code que tu indiques mais, peut-être que le "." remplace, en quelque sorte, le premier "*" (ou "%") du LIKE.

    Quoiqu'il en soit, soit la table Comment suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    comment_id  path
    1           1/
    2           1/2
    3           1/2/3
    4           1/4
    5           1/4/5
    6           1/4/6
    7           1/4/6/7
    ==> de mon point de vue, nous pouvons triturer la chose dans tous les sens mais, le seul moyen de retrouver l'ensemble des path contenant "4", où qu'il soit dans la chaîne de caractères path est :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from Comment where path like "*4*"
    ou
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from Comment where path like "%4%"
    suivant le système.

    Non ?
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  5. #25
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    Le point c'est la concaténation. Je le refais en syntaxe Java. Je n'ai plus en mémoire les API JDBC mais ça va donner un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int id = 4;
    String path = execQuerySingleValue("SELECT path FROM Comments WHERE comment_id = " + id);
    ResultSet rs = execQuery("SELECT path FROM Comments WHERE path LIKE '" + path + "%'");
    Note qu'il faudrait échapper la variable "path" avant de la concaténer, ou bien utiliser une requête paramétrée.

    J'avoue que je ne vois pas du tout où est la difficulté.

  6. #26
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Citation Envoyé par Laffreuxthomas
    J'avoue que je ne vois pas du tout où est la difficulté.
    ==> non, effectivement, il n'y a pas de difficulté mais ce n'est pas une question de difficulté.

    Il s'agit de définir si, en final, et quelque soit les différents systèmes, langages et syntaxes, il faudra utiliser :
    • LIKE "*abc*" qui est très consommateur d'UC car le système est obligé de balayer tous les enregistrements de la table donc, sans pouvoir se positionner à un certain endroit ;

      ou

    • LIKE "abc*" qui est moins consommateur d'UC car le système (si l'index est créé) peut se positionner à l'endroit commençant par "xxx" et balayer les enregistrements suivants, en s'arrêtant au premier enregistrement différent de "abc".

    Donc, en triturant la chose dans tous les sens, il me semble que le seul moyen de retrouver l'ensemble des path contenant "4", où qu'il soit dans la chaîne de caractères path est :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Comment WHERE path LIKE "*4*"
    Non ?
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  7. #27
    Membre éclairé

    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    412
    Détails du profil
    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2002
    Messages : 412
    Points : 657
    Points
    657
    Par défaut
    Citation Envoyé par Richard_35 Voir le message
    Donc, en triturant la chose dans tous les sens, il me semble que le seul moyen de retrouver l'ensemble des path contenant "4", où qu'il soit dans la chaîne de caractères path est :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Comment WHERE path LIKE "*4*"
    Non ?
    Ben oui. Je n'ai jamais eu un besoin pareil.

  8. #28
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Citation Envoyé par Laffreuxthomas
    Ben oui.
    ==> OK, nous sommes donc d'accord.

    Citation Envoyé par Laffreuxthomas
    Je n'ai jamais eu un besoin pareil.
    ==> certes. Mais, il n'est pas impossible que, dans l'avenir, tu (tes utilisateurs) aies(ent) besoin de connaître où intervient le comment n° 4, où qu'il soit dans l'arborescence (donc, dans la chaîne de caractères).

    C'était l'objet du débat, concernant les différentes possibilités de modéliser ce cas, d'où les différents avis négatifs (plutôt tranchés, concernant CinePhil).
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  9. #29
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par Richard_35 Voir le message
    Donc, en triturant la chose dans tous les sens, il me semble que le seul moyen de retrouver l'ensemble des path contenant "4", où qu'il soit dans la chaîne de caractères path est :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Comment WHERE path LIKE "*4*"
    Non ?
    Non.
    "L'ensemble des path contenant "4", où qu'il soit dans la chaîne de caractères path" correspond au 4 et à tous ses descendants :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM Comment WHERE path LIKE(SELECT concat(path, '%') FROM Comment WHERE commentId=4);

  10. #30
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Fred_34,

    Citation Envoyé par sql
    SELECT * FROM Comment WHERE path LIKE(SELECT concat(path, '%') FROM Comment WHERE commentId=4);
    ==> oui, c'est vrai .

    Si j'ai bien compris, cela consiste, d'abord, à trouver l'enregistrement correspondant à l'Id=4 et, ensuite, à effectuer un LIKE "[valeur du path trouvée]*". Donc, effectivement, nous évitons un LIKE "*4*", mais en le remplaçant par deux requêtes (sans doute moins gourmandes que le LIKE "*4*" seul).

    Ceci, pour le cas où un comment_id n'a qu'un seul "père", ce qui correspond bien à l'exemple.
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. représentation d'un arbre lexicographique dans une console
    Par kahrah dans le forum Général Python
    Réponses: 2
    Dernier message: 05/12/2013, 23h54
  2. Graphes représentant une base de données
    Par cyspeo dans le forum Mathématiques
    Réponses: 2
    Dernier message: 20/11/2013, 15h04
  3. [RDF] Représenter une base de données par des vues RDF
    Par NOUR82 dans le forum Ontologies
    Réponses: 2
    Dernier message: 02/04/2013, 00h50
  4. Réponses: 0
    Dernier message: 11/03/2012, 17h42
  5. Réponses: 1
    Dernier message: 24/08/2006, 17h17

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