كيف يمكنني تحديد كافة رقة العقد في التسلسل الهرمي SQL تحت عقدة معينة؟
سؤال
ولدي مجموعة من البيانات التي نماذج تسلسل الفئات. تحتوي فئة الجذر مجموعة من الفئات ذات المستوى الأعلى. كل فئة على مستوى عال تحتوي على مجموعة من الفئات الفرعية.
وكل فئة فرعية لديها مجموعة من المنظمات. يمكن أن يظهر منظمة معينة في فئات فرعية متعددة.
والعقد ورقة من هذا التسلسل الهرمي هي منظمات. منظمة من المحتمل أن تظهر في عدة فئات فرعية.
ويتم تخزين البيانات في الجداول الثلاثة SQL:
organizations
organization_id organization_name
1 Org A
2 Org B
3 Org C
4 Org D
5 Org E
6 Org F
categories
category_id parent_id category_name
0 NULL Top Level Category
1 0 First Category
2 0 Second Category
3 1 Sub Category A
4 1 Sub Category B
5 1 Sub Category C
6 2 Sub Category D
organizations_categories -- Maps organizations to sub_categories
organization_id category_id
1 3
2 3
2 6
3 4
4 4
5 4
6 5
6 4
7 6
8 6
وأود أن تكون قادرة على تحديد قائمة من جميع المنظمات فريدة من نوعها ضمن فئة معينة أو فئة فرعية.
والطريقة أنا أفعل ذلك الآن ينطوي على يستورد لأول مرة والتي تم طلب فئات فرعية ثم حلقات خلال كل sub_category في التعليمات البرمجية وأداء مختارة للحصول على كل المنظمات التي تم تعيينها إلى تلك الفئة. يتم إلحاق نتائج كل حدد لصفيف. هذه المجموعة تحتوي على التكرارات كلما ظهرت منظمة في فئات فرعية متعددة.
وأنا أحب أن يحل محل هذا حل مشكلة مع استعلام يمكن تحديد كفاءة لائحة المنظمات متميزة نظرا معرف من إحدى الفئات في التسلسل الهرمي.
وأنا تنجب هذا الحل باستخدام PHP و MySQL.
وشكرا على وقتك واقتراحاتكم.
المحلول
وعلى افتراض أن التسلسل الهرمي الخاص بك هو دائما بالضبط 3 مستويات عميقة:
SELECT DISTINCT
O.organization_id,
O.organization_name
FROM
Categories CAT
INNER JOIN Categories SUB ON
SUB.parent_id = CAT.category_id
INNER JOIN Category_Organizations CO ON
CO.category_id = SUB.category_id
INNER JOIN Organizations O ON
O.organization_id = CO.organization_id
WHERE
CAT.category_id = @category_id
ويمكنك تعديل ذلك من خلال مستوى واحد للسماح لك لتمرير معرف فئة فرعية. إذا كنت لا تعرف في ذلك الوقت أم لا لديك معرف فئة أو فئة معرف فرعية ثم يمكنك القيام بما يلي:
SELECT DISTINCT
O.organization_id,
O.organization_name
FROM
Categories CAT
LEFT OUTER JOIN Categories SUB ON
SUB.parent_id = CAT.category_id
INNER JOIN Category_Organizations CO ON
CO.category_id IN (CAT.category_id, SUB.category_id)
INNER JOIN Organizations O ON
O.organization_id = CO.organization_id
WHERE
CAT.category_id = @category_id
إذا قد يكون التسلسل الهرمي الخاص بك عدد غير معروف من المستويات (أو كنت تعتقد أنه قد في المستقبل) ثم تحقق من <لأ href = "https://rads.stackoverflow.com/amzn/click/com/1558609202" يختلط = "نوفولو noreferrer"> الأشجار جو كيلكو والهرمية في SQL للسمارتيز عن طرق بديلة لنموذج التسلسل الهرمي. من المحتمل ان يكون فكرة جيدة للقيام بذلك على أي حال.
نصائح أخرى
ولست متأكدا إذا كان نموذج البيانات الخاص بك وسوف تسمح بذلك، ولكن يمكنك استخدام عمود مؤشر واحد وشجرة ثنائي لتخزين هذه المعلومات بسهولة في جدول واحد "OrganizationTree. أيضا لديه فائدة استخدام استعلام واحد مع أي تعديلات للبحث على الصعيدين الفئة، فئة فرعية، أو منظمة (مثل تعطيني كل نتائج X فرعية)
وآمل أن يساعد هذا.
وآدم.