برای طرح سوال و دسترسی به آموزش ها  کانال ما در تلگرام بپویندید  

مرتب سازی درختی در mysql

با سلام

خیلی اوقات هست که ما نیاز به ایجاد سیستم پدر فرزندی داریم یعنی یک سری ایتم اصلی یا پدر داریم که هر کدوم یک سری ایتم فرعی یا فرزند دارن برای نمایش این سیستم روشهای مختلفی هست مثلا بعضی برنامه نویسها با استفاده از چند سلکت این کار رو انجام میدن و بعضی ها هم با یک سلکت و یک تابع بازگشتی این کار رو انجام میدن اما یکی از این روشهای بهینه استفاده از تابع COALESCE در خود mysql هست

مثلا ما جدولی با ستونهای زیر داریم

id,parent,name

 

کوئری ما به صورت زیر خواهد بود

select id,name from table order by COALESCE(parent,id),id

توجه:مقدار parent رکوردهای اصلی یا پدر را null در نظر میگیریم در غیر این صورت از تابع nullif برای تغییر مقدار parent به null استفاده میکنیم

مثال:اگر مقدار parent برای ایتم اصلی یا پدر ۰ در نظر بگیریم

select id,name from table order by COALESCE(nullif(parent,0),id),id


انتشار

در

توسط

برچسب‌ها:

نظرات

5 پاسخ به “مرتب سازی درختی در mysql”
  1. mojtaba نیم‌رخ
    mojtaba

    سلام ، اعتراف میکنم از تابع بازگشتی استفاده میکردم 🙂
    میتونیم یه شرط بزاریم که مثلا از parent=17 به پایین درخت سلکت کنیم ؟

    1. lord_viper نیم‌رخ
      lord_viper

      سلام
      بله کافیه تو شرط بنویسین where parent>۱۷
      البته برای ساختار درختی بهترین روش استفاده از فیلد path یا depth هست
      که در مقاله ای دیگه بهش میپردازیم

      1. mojtaba نیم‌رخ
        mojtaba

        با این شرط تمام parent های بزرگتر از ۱۷ میاد ، در حالی که ممکنه پرنت های بزرگتر از ۱۷ شاخه دیگه ای باشن.
        من میخواستم بدونم میشه یک مسیر با شروع از پرند ۱۷ سلکت کرد ؟

        1. lord_viper نیم‌رخ
          lord_viper

          با سلام
          بله میشه شما باید به دیتابیستون یه فیلد دیگه به اسم path یا depth اضافه کنید مقدار این فیلد برابر مقدار path پرنت + id پرنت جاری میشه مثلا ایتم ۱۷ خودش دسته اصلی هست پس میتونه مقدار path اون ,۰, میشه خب حالا زیر مجموعه این دسته path اونها به این صورت میشه ,۰,۱۷, خب حالا اگه یکی از زیر مجموعه های ایتم ۱۷ ایدی ۲۴ باشه path زیر مجموعه ایدی ۲۴ به صورت ,۰,۱۷,۲۴, میشه حالا به راحتی با یه سلکت where path like ‘,0,17,%’ order by path میتونین فقط زیر مجموعه ۱۷ یا هر زیر مجموعه دیگه رو به صورت سورت شده بدست بیارید و با شمارش تعداد پرنت درون path میتونین جوری کد بنویسین که مثلا تا ۲ لول از زیر مجموعه ایتم ۱۷ رو بیاره
          _______________
          موفق و پیروز باشید

          1. Mahdiam نیم‌رخ
            Mahdiam

            عالی مبین کلاس درس راه انداختی حاجی من خودم دار مستفیض میشم : )

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *