كيف يمكنني تحديد كافة رقة العقد في التسلسل الهرمي SQL تحت عقدة معينة؟

StackOverflow https://stackoverflow.com/questions/378608

  •  22-08-2019
  •  | 
  •  

سؤال

ولدي مجموعة من البيانات التي نماذج تسلسل الفئات. تحتوي فئة الجذر مجموعة من الفئات ذات المستوى الأعلى. كل فئة على مستوى عال تحتوي على مجموعة من الفئات الفرعية.

وكل فئة فرعية لديها مجموعة من المنظمات. يمكن أن يظهر منظمة معينة في فئات فرعية متعددة.

والعقد ورقة من هذا التسلسل الهرمي هي منظمات. منظمة من المحتمل أن تظهر في عدة فئات فرعية.

ويتم تخزين البيانات في الجداول الثلاثة 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 فرعية)

وآمل أن يساعد هذا.

وآدم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top