سؤال

لدي جهاز تشغيل مطحنة مجموعة متداخلة الهرمي نوع الإعداد مع الأعمدة التالية:

اسم الجدول:

myset

الأعمدة:

id, name, lft, rgt

لا أحد يعرف استعلام تحديد الأم من عقدة?

قرأت بضعة أماكن أنه مفيد أيضا parent_id عمود في الجدول الخاص بك لتتبع هذا ، ولكن يبدو زائدة ويبدو أنها يمكن أن تحصل متزامنة مع مجموعة متداخلة إذا كان استعلام كان يتم بشكل غير صحيح عند إضافة/إزالة/نقل أي شيء داخل المجموعة.

نصائح أخرى

TOP هو أمر MSSQL، واستخدام LIMIT لماي:

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

ويجب أن تفعل خدعة ..

فقط إضافة إلى هذه الإجابات التي ساعدتني كثيرا ،

كنت بحاجة إلى العثور على الأصل فوري من عقدة ، وكذلك أعلى مستوى الوالدين من عقدة سلسلة في بعض الحالات ،

لقد استعملت ما يلي قاعدة للحصول على العناصر في الطفل إلى الوالد النظام

SELECT parent.*  FROM
        nested_set node,
        nested_set parent
        WHERE (
            node.set_left BETWEEN parent.set_left AND parent.set_right          
        )
        AND node.set_id={CHILD_NODE_ID_HERE}
        ORDER BY parent.set_right - parent.set_left
        #LIMIT 1,1

ومن ثم مسألة إضافة LIMIT 1,1 فقط التقاط الصف الثاني يكون الأصل فوري

كما تجدر الإشارة إلى أنه مع الاستعلام أعلاه إذا كانت العقدة نفسها هي أعلى مستوى من الوالدين ، ثم فإنه لن يكون الأصل فوري, حتى مع LIMIT 1,1 فإنه يجب إرجاع النتائج فارغة

للحصول على أعلى مستوى من الوالدين عكس order شملت التحقق من إذا كانت العقدة نفسها أعلى من الوالدين ، و محدودة نتيجة الصف الأول

SELECT parent.* AS top_level_right FROM
        nested_set node,
        nested_set parent
        WHERE (
            node.set_left >= parent.set_left 
            AND node.set_left <= parent.set_right
        )
        AND node.set_id={CHILD_NODE_ID_HERE}
        ORDER BY parent.set_left - parent.set_right
        LIMIT 1

في الماضي الاستعلام اعتدت >= <= المشغلين بحيث النطاق المحدد يشمل عقدة الطفل إذا كان يحدث أيضا أن تكون أعلى مستوى من الوالدين

وكان لي مشكلة مع الاستعلام Lucasz ل. لم يفهم لي نسخة من الخلية الأمر فوق. اضطررت لاستخدام LIMIT بدلا من ذلك. هنا هو رمز المنقحة.

SELECT 
   `id`, 
   (SELECT 
      `id`
    FROM 
       `[*** YOUR TABLE ***]` AS `t2` 
    WHERE 
       `t2`.`left_id`  < `t1`.`left_id`AND 
       `t2`.`right_id` > `t1`.`right_id`
    ORDER BY 
       `t2`.`right_id`-`t1`.`right_id`ASC 
    LIMIT 
       1) AS `parent`
FROM 
    `[*** YOUR TABLE ***]` AS `t1`
WHERE 
    `t1`.`id` = [*** ID OF THE NODE WHOS PARENT YOU WISH TO LOOKUP ***]
ORDER BY 
    `right_id`-`left_id` DESC

ومن الواضح أن تغيير الاشياء في الصورة على [] لتلائم الاحتياجات الخاصة بك. أيضا إزالة [] الصورة. هذا الاستعلام بإرجاع فقط صف واحد. مثل ذلك ...

id  parent
7   3
select * from myset
  where lft < :lftOfCurrent and rgt > :lftOfCurrent
  order lft desc
  limit 1

هل يمكن استخدام كحد أقصى بدلا من النظام / الحد، وربما بحاجة لكم الكلمة أخرى للحد من النتائج إلى صف واحد اعتمادا على قاعدة البيانات الخاصة بك. بين بدلا من <و> ستعمل إذا كانت قاعدة البيانات بإرجاع مجموعة الحصري، والتي لا الخلية لا.

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;

ويتم إرجاع جميع الأجداد من قبل

SELECT id FROM thetable
WHERE x BETWEEN lft and rgt;

وهكذا، الوالد المباشر هو الجد مع أصغر الفرق بين LFT وRGT.

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

وكان رمز من spankmaster79 يست خاطئة تماما. I تعديل كود له وأنه يعمل.

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
scroll top