PDA

View Full Version : پیمایش در دیتابیس



maXXis
چهارشنبه 18 تیر 1393, 19:31 عصر
سلام دوستان
من یک سایتی دارم که عضو گیری داره. هرکس عضو میشه باید یک نفر معرفیش کرده باشه.
بعد همین جور که پیش بریم میشه شبیه یک درخت.
120946
یعنی یوزر ها یک سری زیر مجموعه دار میشن.
تو دیتابیس هم فقط id یوزر معرف رو درج میکنم.
حالا من میخوام به یوزرام بگم که تو هر سطح چند تا زیر مجموعه داره
مثلا در عکس بالا
سطح یک : 2
سطح دو : 4
سطح سه : 3

چطوری این کارو انجام بدم؟

abolfazl-z
چهارشنبه 18 تیر 1393, 22:29 عصر
درخت شما دودویی کامل هست ؟

maXXis
پنج شنبه 19 تیر 1393, 15:31 عصر
نه. شاید یک نفر 10 تا زیر مجموعه مستقیم داشته باشه.

abolfazl-z
پنج شنبه 19 تیر 1393, 16:00 عصر
120994

یعنی شما در واقع عدد های سمت راست را می خواهید ؟

یعنی شما میخواهید با دادن سطح مثلا 0 یا 1 و ... بدونید که در آن سطح چند تا عضو وجود دارد ؟

درست هست ؟

maXXis
پنج شنبه 19 تیر 1393, 16:40 عصر
آره دقیقا . این درخت پویا هست .
معلوم نیست چقدر عمق داره و هر نود چند فرزند داره.
من میخوام تو پروفایل هر کس بهش بگم چند نفر زیر مجموعه سطح یک هستن. چند نفر سطح دو الی آخر.

abolfazl-z
پنج شنبه 19 تیر 1393, 16:58 عصر
من برایتون تحلیل می کنم برنامه اش با خودتون

برای اینکه بتونین تعداد اعضا موجود در هر سطح را بدست بیاورید از روش ذیل عمل کنید :

بر فرض مثال سطح 2 دارای چند عضو هست ؟

درواقع میشود اینطور تعریف کرد تعداد فرزند های پدر های سطح قبلی جواب شما هست.

گفتیم 2 دیگه پس 2 منهای 1 میشه 1

حالا تعداد فرزند، فرزند های سطح 1 می شوند جواب ما یعنی 1 - 6 - 14

درضمن یادتون باشه اگر منهای یک کردیم و کوچیک تر از صفر در امد یعنی -1 خروجی را برابر 1 میدهیم درواقع از ما سطح صفر خواسته.

plague
پنج شنبه 19 تیر 1393, 17:26 عصر
با یه آرایه چند بعدی میتونی شبیه سازیش بکنی



$all = array(
'users'=>10 ,
'users_id'=>'1,2,3,4,5,6,7,8,9,10',
'sub_users'=>array(

'users'=>5 ,
'users_id'=>'11,22,33,44,55,
'sub_users'=>array(

'users'=>2 ,
'users_id'=>'111,222,
'sub_users'=>array(

'users'=>0
)

)
)
);



با توجه به مثال بالا یه حلقه بزار که تا وقتی تعداد users ها 0 نشده (یعنی هنوز زیر مجموعه ای وجود داره) از دیتبایس بخونه کاربر ها رو و به آرایه ما اضافشون کنه

maXXis
پنج شنبه 19 تیر 1393, 17:52 عصر
فکر نکنم با این روش جواب بده.
بذارید یک صفحه از دیتابیس رو بزارم .
120999

اون که ایدیش 1 هستش سر گروه اولیه هستش که کسی معرفیش نکرده.
درختش مثل این میشه.
121000
حالا مثلا میخوام به اون که آیدیش 2 هستش بگم تو :
4 نفر سطح یک داری
7 نفر سطح دو داری
2 نفر سطح سه داری

یا مثلا به کسی که آیدیش 8 هستش بگم
3 نفر سطح یک داری
1 نفر سطح دو

و بهمین ترتیب برای تمام افراد

abolfazl-z
پنج شنبه 19 تیر 1393, 18:14 عصر
دوست عزیز الان مگر مشکلت حل نشد ؟

H:Shojaei
پنج شنبه 19 تیر 1393, 18:24 عصر
سلام...
این چیزی که میخواید با فرمولهای ریاضی شاید انجام بشه ولی چون قائده و قانون خاصی نداره بعید میدونم اما یه راه حل به نظر من میرسه که بگم شاید کمکی بکنه...
مثلا فرض کنید یه کاربر 2 داریم این کاربر 2 کاربرهای 5 و 10 رو اضافه کرده بعد باز کاربر 5 کاربر 12 و 14 رو و کاربر 10 هم 20 و 25 رو ادد کرده میشه:





2






5



10



12

14

25

20



حالا واسه این که بگیم کاربر 2 تو هر سطح چند تا کاربر رو تونسته مستقیم یا غیر مستقیم اد کنه باید تمام سطح ها رو پیمایش کنیم پیمایش چطور میشه با سلکت هایی که داخل یه حلقه قرار دارن مثلا ببینید:
اولین کوئری میشه:
select * from tbl where leader=2
این کوئری 2 تا سطر رو برمیگردونه که 5 و 10 هستن که میشه تعداد تو سطح اول باز واسه هرکروم از این سطرها باید یه کوئری بزنید که اون هر فرزند چندتا فرزند دیگه داره کا این میشه تعداد تو سطح دوم و...
مثلا این دوتا کوئری میشه:
select * from tbl where leader=5
+
select * from tbl where leader=10
حالا کدش به چه شکل میشه:
یه حلقه while داریم که چک میکنه تا زمانی که فرزندی تو سطحی که هستیم وجود داره این حلقه ادامه چیدا کنه...
داخل این وایل یه فور داریم که هر بار به تعداد فرندان اون سطح باید اجرا بشه مثلا تو سطح اول که 5 و 10 هستن باید به ازای هر کدوم از این ها یه کوئری اجرا بشه که تعداد فرزندان کاربر 2 تو سطح 3 به دست بیاد (همون دوتا کوئری که نوشتم) حالا وقتی این دوبار اجرا شد باید باز حلقه به اندازه فرزندانی که تو سطح 3 قرار دارن بچرخه که اینجا چهارتاس 12 و 14 و 20 و 25 و فرزندان اینا میشه تعداد فرزندان 2 تو سطح 4 و همینطوری پیش میره و وقتی که به یه جایی رسیدیم که فرزندی نبود while دیگه نباید اجرا بشه و هر سطر فرزنداش به دست اومده...
الگوریتمش الآن که نوشتم تو ذهنم تحلیلشم کردم جواب میده ولی باید درست پیاده سازی بشه البته اگه راهکار ساده تری پیدا نشه...
موفق باشید...
-------------------
البته الان که فکر میکنم میبینم همون حلقه While رو هم نمیخواد شما میتونید تو خود همون for چک کنید که مثلا این سطحی که هستیم فرزندی توش هست یا نه اگه نبود دیگه حلقه ادامه پیدا نمیکنه ولی اگه بود حلقه باید به تعداد فرزندان اون سطح اجرا بشه...