با سلام
خیلی اوقات هست که ما نیاز به ایجاد سیستم پدر فرزندی داریم یعنی یک سری ایتم اصلی یا پدر داریم که هر کدوم یک سری ایتم فرعی یا فرزند دارن برای نمایش این سیستم روشهای مختلفی هست مثلا بعضی برنامه نویسها با استفاده از چند سلکت این کار رو انجام میدن و بعضی ها هم با یک سلکت و یک تابع بازگشتی این کار رو انجام میدن اما یکی از این روشهای بهینه استفاده از تابع 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
سلام ، اعتراف میکنم از تابع بازگشتی استفاده میکردم 🙂
میتونیم یه شرط بزاریم که مثلا از parent=17 به پایین درخت سلکت کنیم ؟
سلام
بله کافیه تو شرط بنویسین where parent>۱۷
البته برای ساختار درختی بهترین روش استفاده از فیلد path یا depth هست
که در مقاله ای دیگه بهش میپردازیم
با این شرط تمام parent های بزرگتر از ۱۷ میاد ، در حالی که ممکنه پرنت های بزرگتر از ۱۷ شاخه دیگه ای باشن.
من میخواستم بدونم میشه یک مسیر با شروع از پرند ۱۷ سلکت کرد ؟
با سلام
بله میشه شما باید به دیتابیستون یه فیلد دیگه به اسم path یا depth اضافه کنید مقدار این فیلد برابر مقدار path پرنت + id پرنت جاری میشه مثلا ایتم ۱۷ خودش دسته اصلی هست پس میتونه مقدار path اون ,۰, میشه خب حالا زیر مجموعه این دسته path اونها به این صورت میشه ,۰,۱۷, خب حالا اگه یکی از زیر مجموعه های ایتم ۱۷ ایدی ۲۴ باشه path زیر مجموعه ایدی ۲۴ به صورت ,۰,۱۷,۲۴, میشه حالا به راحتی با یه سلکت where path like ‘,0,17,%’ order by path میتونین فقط زیر مجموعه ۱۷ یا هر زیر مجموعه دیگه رو به صورت سورت شده بدست بیارید و با شمارش تعداد پرنت درون path میتونین جوری کد بنویسین که مثلا تا ۲ لول از زیر مجموعه ایتم ۱۷ رو بیاره
_______________
موفق و پیروز باشید
عالی مبین کلاس درس راه انداختی حاجی من خودم دار مستفیض میشم : )