Requete imriquée a l'infini ?! - SQL/NoSQL - Programmation
Marsh Posté le 16-12-2004 à 11:55:13
Je ne connais pas de moyen de faire ça en une seule requête...
Marsh Posté le 16-12-2004 à 12:07:51
Dr Raf a écrit : bah en plusieurs requêtes ? n'importe kelle méthode... |
Tu n'utilises pas un langage pour traiter tes données derrière?
Si oui tu peux le faire dans une boucle récursive....
Marsh Posté le 16-12-2004 à 12:50:47
Dr Raf> heuu si j'ai bien compris ton truc, en fait, un fils d'un fils d'un fils d'un fils .. etc .. est aussi considéré comme fillieul du parent du tout premier fils ??
Marsh Posté le 16-12-2004 à 12:57:31
Tu utilises quel SGBD ?
Avec Oracle c'est possible, on utilise CONNECT BY / START WITH :
http://www.info.univ-angers.fr/pub [...] lsql2.html
Marsh Posté le 17-12-2004 à 14:49:55
Mr Mala a écrit : Dr Raf> heuu si j'ai bien compris ton truc, en fait, un fils d'un fils d'un fils d'un fils .. etc .. est aussi considéré comme fillieul du parent du tout premier fils ?? |
heu oui.
Beegee a écrit : Tu utilises quel SGBD ? |
MySQL (free en faite...)
Marsh Posté le 17-12-2004 à 17:34:04
Ce n'est pas possible avec une seule table, sauf si le nombre de niveaux est limité.
Sinon, il faut revoir le modèle avec 2 tables :
Une pour les users et une pour les ids des parents (plus niveau) d'un user. Mais ça c'est super chiant à maintenir.
Dans ton modèle, est-il possible de supprimer un user de la table. Si oui, que deviennent ses fils ?
Marsh Posté le 03-01-2005 à 12:11:54
oui on peut supprimer un user de la table, et l'user qui l'a supprimé hérite de ses fils.
Marsh Posté le 03-01-2005 à 14:40:42
OK.
On a un problème assez similaire dans notre appli. On gère un arbre de pages et ça fait souvent beaucoup de requêtes pour pas grand chose.
Pour améliorer la situation, on a un champ suplémentaire dans la table qui stock le chemin sous la forme d'une chaîne de caractères.
Exemple :
user_id parent_id path |
parent_id est là pour gérer l'intégrité et path pour faire des requêtes du genre :
select * from user where path like "%.1.%"
qui retourne donc la liste des enfants de 1, quel que soit sont niveau de parenté.
La contrepartie, c'est qu'il faut maintenir ce champ. En cas de problème, une petit routine peut le recalculer.
C'est VILAINPABÔ, mais c'est mieux que des requêtes en boucle...
Marsh Posté le 04-01-2005 à 10:35:00
Y'a un avantage inatendu au champ path.
Si tu fais une requête triée sur path, tu te retrouve avec une liste de users triés dans le même ordre que le parcours de l'arbre des users.
EDIT :
Merde, en fait, c'est pas vrai du tout !
Pour que ça marche, il faut que dans le path, les IDs aient tous la même longeur...
Re merde, ça me fout tout mon truc en l'air
Marsh Posté le 04-01-2005 à 14:14:55
Bah mets les ID sur 2 caractères (01, 02, etc.) par exemple, de toute façon en stoquant le path, tu fixes implicitement une limite au nombre d'ID, non ?
Marsh Posté le 04-01-2005 à 15:04:02
Mara's dad a écrit : OK.
|
Ouais m'enfin dans ton truc, un fils n'a pas intérêt à être adopté par un autre père (ce qui peut très bien être possible), parceque pour recalculer les path, ça va faire paf le chien
Marsh Posté le 04-01-2005 à 17:02:33
ya pas forcement besoin de recalculer le path mais de remplacer la partie du path correspondant à l'ancien père par le path du nouveau pour tous les fils impliqués soit qqch du genre :
Code :
|
Marsh Posté le 04-01-2005 à 17:14:23
Mouais.
M'enfin j'au aucune confiance dans ce genre de trucs...
Tiens, j'ai une idée pour SQL Server... Quand MySQL supportera correctement le PL/SQL ça sera aussi applicable
Marsh Posté le 04-01-2005 à 17:59:54
Et hop
Code :
|
Marsh Posté le 05-01-2005 à 12:45:42
Mara's dad a écrit : Y'a un avantage inatendu au champ path. |
pour les trier tu fais ça :
usort($monTableau, 'strnatcasecmp'); |
et hop ton tableau est vraiment trié de manière logique, c'est à dire,
.1 < .1.1 < .1.2 < .1.10 < .1.22
et non ça :
.1 < .1.1 < .1.10 < .1.2 < .1.22
Marsh Posté le 16-12-2004 à 11:53:21
Bon voilà ca va être chaud a expliquer..
g une table :
-----------
UTILISATEUR
-----------
#login
pass
email
parent
-----------
*un utilisateur -si il a les droits, peut créer un autre utilisateur qui -si il lui donne les droits, pourra à son tour créer d'autres utilisateurs, etc...
*le champs "parent" renseigne le login de son créateur
j'aimerais pouvoir selectioner tous les filleuils d'un utilisateur (sur plusieurs niveaux eventuellement donc), est ce que ca serait possible une telle requête déja ?
un truc dans le genre :