الخلية مجموعات متداخلة - كيف تجد الأم من عقدة?
-
05-07-2019 - |
سؤال
لدي جهاز تشغيل مطحنة مجموعة متداخلة الهرمي نوع الإعداد مع الأعمدة التالية:
اسم الجدول:
myset
الأعمدة:
id, name, lft, rgt
لا أحد يعرف استعلام تحديد الأم من عقدة?
قرأت بضعة أماكن أنه مفيد أيضا parent_id عمود في الجدول الخاص بك لتتبع هذا ، ولكن يبدو زائدة ويبدو أنها يمكن أن تحصل متزامنة مع مجموعة متداخلة إذا كان استعلام كان يتم بشكل غير صحيح عند إضافة/إزالة/نقل أي شيء داخل المجموعة.
المحلول
هذا السؤال أ >. وهو مشابه لسؤالك. لقد نشرت هناك استعلام قد تحتاجها.
SELECT title, (SELECT TOP 1 title
FROM tree t2
WHERE t2.lft < t1.lft AND t2.rgt > t1.rgt
ORDER BY t2.rgt-t1.rgt ASC) AS parent
FROM tree t1
ORDER BY rgt-lft DESC
وآمل أن يكون هناك ما تحتاجه.
لالجدول التالي:
+-------------+----------------------+-----+-----+
| category_id | name | lft | rgt |
+-------------+----------------------+-----+-----+
| 1 | ELECTRONICS | 1 | 20 |
| 2 | TELEVISIONS | 2 | 9 |
| 3 | TUBE | 3 | 4 |
| 4 | LCD | 5 | 6 |
| 5 | PLASMA | 7 | 8 |
| 6 | PORTABLE ELECTRONICS | 10 | 19 |
| 7 | MP3 PLAYERS | 11 | 14 |
| 8 | FLASH | 12 | 13 |
| 9 | CD PLAYERS | 15 | 16 |
| 10 | 2 WAY RADIOS | 17 | 18 |
وأنها تنتج الإخراج:
title | parent
----------------------------------------------
ELECTRONICS | NULL
PORTABLE ELECTRONICS | ELECTRONICS
TELEVISIONS | ELECTRONICS
MP3 PLAYERS | PORTABLE ELECTRONICS
FLASH | MP3 PLAYERS
CD PLAYERS | PORTABLE ELECTRONICS
2 WAY RADIOS | PORTABLE ELECTRONICS
TUBE | TELEVISIONS
LCD | TELEVISIONS
PLASMA | TELEVISIONS
نصائح أخرى
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