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
8 Réponses :
Savez-vous pourquoi la commande par t2.rgt-t1.rgt code> retournera une erreur dans SQLite?
SQLSTATE [HY000]: Erreur générale: 1 Non Colonne de ce type: T1.RGT CODE> ... Il fonctionne lorsque je supprimai T1.RGT de la commande par de sorte qu'il semble donc être un problème avec la commande par ...
Tous les ancêtres sont retournés par
SELECT id FROM thetable WHERE x BETWEEN lft and rgt ORDER BY (rgt-lft) LIMIT 1
Si votre X devrait être l'identifiant de l'élément, vos déclarations sont erronées.
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
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
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
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.
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, P>
J'ai utilisé ce qui suit comme base pour obtenir les éléments de la commande enfant à paraître p> Il s'agit alors d'ajouter le 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 fort> fort>, donc avec la limite 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 p> dans la dernière requête que j'ai utilisée limite 1, 1 code> pour capter uniquement la deuxième ligne qui serait le parent immédiat p>
1,1 code> il doit renvoyer un ensemble de résultats vide p>
> = < = code> 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 p> p>
Pourquoi utiliser commander par parent.set_left - parent.set_right asc code> et non
commander par parent.lft desc code>? Votre méthode recherche la plus petite écart, la mine reçoit simplement le parent immédiat en utilisant une méthode plus rapide.
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;