سؤال

دعونا أقول إن لدي الاسم الأول> middlename> العائلة التسلسل الهرمي (~ 10K الصفوف، من أجل السؤال). هذا يعني أن لديك "John> Mary-Anne> Eddy" أو "Eddy> John> Jacob". النقطة الرامية إلى أن التسلسل الهرمي لا معنى له وغير أجنبي للغاية للمستخدم (على عكس، على سبيل المثال، البلد> الولاية> هيكل المدينة).

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

الآن، لأن هناك الكثير من الأشخاص الذين يحملون اسم "John"، فمن المعلن أنه إذا اكتب "جون"، فإنهم يحصلون فقط على نتائج مثل

  • جون> ألين> ألكسندر
  • جون> ألين> بورشلاويتز
  • جون> ألين ... كرر 100 مرة ...

لأنهم لن يروا الصف الفريد "جيسون> جون> سميث".

بدلا من ذلك، يجب أن يعودوا شيء مثل ("*" هو مجرد مؤشر تعسفي للمستخدم "مهلا، الكثير من الصفوف الموجودة أسفل هذا"):

  • جون> ألين> *
  • جيسون> جون> سميث
  • مايك> جون> *
  • ماري> إيلينا> جوناسون

إذا اكتبوا "جون> آل"، فإن النتائج ستتقتصر على أي شيء تحت "John>"، ولكن يجب تجميعها بالمثل أعلاه.

آمل أن يكون التفسير واضحا. المتطلبات فضفاضة بعض الشيء. فقط من المعقول حتى يتمكن الشخص من البحث من خلال الشجرة والعثور على ما هي عليه بعد.

في الوقت الحالي، لدي بعض SQL مثيرة للاهتمام التي تبحث عن مصطلح البحث في الصف، وأرقام موقعها، أو تقوم ببعض السلالات الفرعية، والجماعة، والطلب للحصول على النتائج المذكورة أعلاه، ولكنها لا تؤدي بشكل جيد بما فيه الكفاية.

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

هل كانت مفيدة؟

المحلول

argh. آسف لم أكن قادرا على وصف مشكلتي. على أي حال، إليك الحل الذي توصلت إليه.

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

على سبيل المثال من mytable(A, B, C), ، يزيد search_t(A, B, C, level)

لذلك، مع "واحد> اثنين> ثلاثة"، يمكنك إنشاء 3 صفوف (A، B، C، المستوى):

  • "واحد"، فارغ، فارغ، 1
  • "واحد"، "اثنان"، فارغة، 2
  • "واحد"، "اثنين"، "ثلاثة"، 3

عند البحث، يمكنك تقييد المستوى عن طريق اختيار قيمة للمستوى وتوفير القيم لأعمدة المستوى العلوي:

WHERE A='One' and level > 1 and (B like '%t%' or C like '%t')

يمكن أن يكون مبسط بعض الشيء والأجنحة إذا قمت بإنشاء search_str عمود وأداء LIKE مطابقة ضد ذلك بدلا من ذلك.

WHERE A='One' and level > 1 and search_str like '%t%'

في Retrospect، ربما كان هذا أكثر وضوحا إذا كانت البيانات بالفعل في نموذج قائمة مجاورة.

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