Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > SQLite
SQLite Forum d'entraide SQLite
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/07/2011, 21h18   #1
Membre éprouvé
 
Inscription : octobre 2002
Messages : 481
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 481
Points : 402
Points : 402
Par défaut Utilisation de LIKE et wildcards

Bonjour,

J'ai mis en place une table pour gérer des données hiérarchiques selon la méthode du "materialized path" comme décrite ici.

Pas de problème, ça marche bien... sauf pour la sélection de nœuds d'un certain niveau, qui normalement doit se faire avec (voir lien précédent, en tout bas de page):
Code :
1
2
SELECT * FROM tree
WHERE path LIKE '/%/%/' OR path LIKE '/%/%/%/'; // nœuds de niveau 3 et 4
Je cherche précisément à retourner tous les nœuds de niveau 2 donc en théorie la commande suivante devrait convenir...
Code :
1
2
SELECT * FROM tree
WHERE path LIKE '/%/';
... et me retourner uniquement les lignes dont path est du genre '/1/', '2/', '/3/'... mais cette commande me renvoie aussi les nœuds des niveaux suivants: '/1/4/', '/1/4/5/', '/1/6/', '/1/6/7/', etc.

Comment faire pour limiter la sélection aux chemins (path) de niveau 2, exclusivement ?

Merci
GoustiFruit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 09h39   #2
Membre éprouvé
 
Inscription : octobre 2002
Messages : 481
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 481
Points : 402
Points : 402
Je me réponds tout seul, ça pourra servir à d'autres. Je n'ai pas tout testé mais d'après ce que j'ai compris, ça devrait marcher comme ça.

Quelques exemples...

1- pour sélectionner tous les chemins de niveau 2 ou plus:
Code :
1
2
SELECT * FROM tree
WHERE path LIKE '/%/';
2- pour sélectionner tous les chemins de niveau 3 ou moins:
Code :
1
2
SELECT * FROM tree
WHERE path = '/' OR path LIKE '/%/' AND path NOT LIKE '/%/%/%/';
3- pour sélectionner tous les chemins de niveau 2 seulement:
Code :
1
2
SELECT * FROM tree
WHERE path LIKE '/%/' AND path NOT LIKE '/%/%/';
4- pour sélectionner tous les chemins de niveau 3 seulement:
Code :
1
2
SELECT * FROM tree
WHERE path LIKE '/%/%/' AND path NOT LIKE '/%/%/%/';
PS: un petit truc pour déterminer le niveau (profondeur) du chemin: compter le nombre de "/". Hélas il n'y a pas de fonction dans SQLite permettant de le faire, ça eut été bien pratique !
GoustiFruit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 09h43   #3
Membre éprouvé
 
Inscription : octobre 2002
Messages : 481
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 481
Points : 402
Points : 402
Une autre solution serait de stocker la longueur du chemin dans une colonne supplémentaire !

Il suffirait alors de faire des requêtes de ce genre:
Code :
1
2
SELECT * FROM tree
WHERE path_level > 2
Hmm, je me tâte...
GoustiFruit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/08/2011, 16h10   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 955
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 955
Points : 17 779
Points : 17 779
Au lieu de la représentation par matérialisation du chemin qui est très couteuse en terme de mise à jour comme en volume, vous auriez mieux fait d'utiliser la représentation intervallaire très optimisée comme je le décris ici : http://sqlpro.developpez.com/cours/arborescence/
Le nombre de niveau étant facilement calculable avec une simple requête pouvant utiliser les index de la table.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 10h06   #5
Membre éprouvé
 
Inscription : octobre 2002
Messages : 481
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 481
Points : 402
Points : 402
J'avais étudié la possibilité d'utiliser cette méthode (nested sets) mais au final j'ai préféré celle des materialized paths. Je n'ai plus les liens sous la main, mais des points de vue de la simplicité des requêtes et de l'efficacité/performance, la méthode que j'ai choisie était largement gagnante dans mon cas (stockage d'urls hiérarchiques et limitées en profondeur).
Le seul problème avec les materialized paths c'est justement cette magouille avec les wildcards et LIKE parce que /%/ englobe aussi bien /123/ que /45/67/89/
GoustiFruit est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h29.


 
 
 
 
Partenaires

Hébergement Web