11
votes

MySQL Set imbriqués - Comment trouver le parent de nœud?

J'ai votre époque de la configuration de type hiérarchie définie de la moulin avec les colonnes suivantes:

Nom de la table: P>

id, name, lft, rgt


0 commentaires

8 Réponses :



0
votes

Tous les ancêtres sont retournés par

SELECT id FROM thetable
WHERE x BETWEEN lft and rgt
ORDER BY (rgt-lft)
LIMIT 1


1 commentaires

Si votre X devrait être l'identifiant de l'élément, vos déclarations sont erronées.



2
votes

J'ai eu un problème avec la requête de Lucasz. Ma version de MySQL n'a pas compris la commande supérieure. J'ai dû utiliser la limite à la place. Voici le code révisé.

id  parent
7   3


0 commentaires

17
votes

Top est une commande MSSQL, utilisez la limite de MySQL:

SELECT title, (SELECT title 
       FROM tree t2 
       WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt    
       ORDER BY t2.rgt-t1.rgt ASC
       LIMIT 1) 
AS parent FROM tree t1 
ORDER BY (rgt-lft) DESC


0 commentaires

0
votes

Le code de Spankmaster79 n'était pas complètement faux. J'ai modifié son code et cela a fonctionné.

SELECT parent . * FROM Nested_Category AS node, Nested_Category AS parent 
enter code hereWHERE node.leftSide
BETWEEN parent.leftSide
AND parent.rightSide
AND node.id ='Enter the Node ID'
ORDER BY (
parent.rightSide - parent.leftSide
)
LIMIT 1 , 1


0 commentaires

1
votes
select * from myset
  where lft < :lftOfCurrent and rgt > :lftOfCurrent
  order lft desc
  limit 1
You could use a max rather than order/ limit and you might need another keyword to limit the results to one row depending on your database. Between rather than < and > would work if your database returns the exclusive set, which MySQL doesn't.

0 commentaires

3
votes

Juste pour ajouter à ces réponses qui m'a aidé beaucoup,

Je devais trouver le parent immédiat d'un nœud, ainsi que le parent de niveau supérieur de la chaîne de nœuds dans certains cas,

J'ai utilisé ce qui suit comme base pour obtenir les éléments de la commande enfant à paraître xxx

Il s'agit alors d'ajouter le limite 1, 1 pour capter uniquement la deuxième ligne qui serait le parent immédiat

Il convient également de noter qu'avec la requête ci-dessus si le nœud lui-même est le type de niveau supérieur de haut niveau, il n'aurait pas pu un parent immédiat , donc avec la limite 1,1 il doit renvoyer un ensemble de résultats vide

pour obtenir le parent de niveau de haut niveau que j'ai inversé la commande Par clause, inclus un chèque si le nœud lui-même est le parent supérieur et limité le résultat de la première ligne xxx

dans la dernière requête que j'ai utilisée > = < = opérateurs de sorte que la plage sélectionnée englobe le nœud enfant s'il s'agisse également du parent de haut niveau


1 commentaires

Pourquoi utiliser commander par parent.set_left - parent.set_right asc et non commander par parent.lft desc ? Votre méthode recherche la plus petite écart, la mine reçoit simplement le parent immédiat en utilisant une méthode plus rapide.



1
votes
SELECT parent.name 
FROM myset AS node, myset AS parent 
WHERE parent.lft < node.lft 
AND parent.rgt > node.rgt 
AND node.id = {YOUR CATEGORY ID} 
ORDER BY ( parent.rgt - parent.lft ) ASC LIMIT 1;

0 commentaires