View Full Version : نمایش حالت پدر فرزندی
علیرضا حسن زاده
پنج شنبه 02 تیر 1390, 18:06 عصر
سلام
من یه جدول دارم که در تا از فیلدها به صورت زیر هست:
1-ID که کلید جدول هست و به صورت عددی
2- ParentId که با اون یه رکورد رو منتسب به رکورد دیگه می کنم (یعنی این رکورد فزرند رکوردی با شماره IDیی هست که در ParentIdیش وارد شده)
حالا وقتی اینا رو Select کنم می خوام به صورتی نشون بده که اول رکورد پدر بعد فرزنداش بعد دوباره رکورد بعدی که پدر هست و بعد فرزندان اون رکورد و....
چطوری میتونم برای این جدول Selectی با این حالت بنویسم؟
محمد سلیم آبادی
جمعه 03 تیر 1390, 04:36 صبح
حالا وقتی اینا رو Select کنم می خوام به صورتی نشون بده که اول رکورد پدر بعد فرزنداش بعد دوباره رکورد بعدی که پدر هست و بعد فرزندان اون رکورد و....من فکر می کنم منظورتون از فرزندان، تنها اولین سطح از فرزندان باشد. یعنی فرزند مستقیم پدر. چرا که فرزند فرزند پدر نیز جز فرزند پدر محسوب می شود. در واقع من برداشتم first_level_childeren هست.
از طرفی ذکر نشده که گره های برگ که هیچ فرزندی ندارند را نیز می خواهید انتخاب شوند یا خیر. (البته این با کمک ماده ی WHERE و یک شرط ساده امکان پذیر است).
از آنجایی که هیچ گونه جدول آزمایشی و داده های آزمایشی و نتیجه ی مطلوب داده نشده است من بر اساس فرضیات جواب زیر را داده ام. بدیهی است که ممکن است آن چیزی نباشد که شما می خواهید چرا که من قادر نیستم بدون داشتن داده های خام و نتیجه ی پردازش شده راه حل دقیق خود را ارائه دهم.
راه حل زیر در نسخه ی 2005 نرم افزار SQL Server قابل اجراست. (به غیر از بخش درج داده ها که در 2008 اجرایش ممکن است)
/*
a
|
b
/ | \
c d e
/ \ \
f g h
*/
declare @tree table
(id char(1) primary key,
parentid char(1) null);
insert @tree
values ('a', null), ('b', 'a'),
('c', 'b'), ('d', 'b'), ('e', 'b'),
('f', 'c'), ('g', 'c'),
('h', 'e');
SELECT id, COALESCE(STUFF(list, 1, 1, ''), '') AS childeren
FROM @tree AS T
CROSS APPLY
(SELECT ', ' + id
FROM @tree
WHERE parentid = T.id
FOR XML PATH('')) D(list);
/*Result Set
id first_level_childeren
---- ---------------------
a b
b c, d, e
c f, g
d
e h
f
g
h
*/
علیرضا حسن زاده
جمعه 03 تیر 1390, 13:14 عصر
با فرض داده های زیر:
ID ParentId
0 1
0 2
0 3
2 4
3 5
وقتی Select می کنم می خوام اطلاعات به صورت زیر نمایش داده بشه (ضمنا از SQLExpress 2008 استفاده می کنم):
ID ParentId
0 1
0 2
2 4
0 3
3 5
یعنی تمام رکورد ها نمایش داده بشن ولی به صورتی که اول رکورد پدر بعد تمام فرزندان اون رکورد بع رکورد پدر بعدی و فرزندانش و ... رابطه پدر فرزندی هم فقط یک سطح هست یعنی هر فرزندان شامل فرزندان دیگری نیستن
اگه ممکنه راهنمایی کنید؟
محمد سلیم آبادی
شنبه 04 تیر 1390, 03:15 صبح
این ساختار جنگل (forest) نام داره. چرا که شما سه درخت 2 سطحی جدا از هم دارید. اینکه مقدار 0 را به عنوان معرف گره ی ریشه در نظر گرفتید اصلا مناسب نیست. بایستی مقدار Null معرف ریشه باشه.
نیاز شما فقط یک Order by معمولی هست. الان بازم نمی تونم جواب دقیق بدم چرا که ساختار جدول رو برام تعریف نکردید و نمیدونم دقیقا از چه نوع data type و چه نوع داده هایی استفاده می کنید. ولی اگه بخواهیم داده ها را رشته ای (با طول متغیر) در نظربگیریم آن وقت داریم:
SELECT *
FROM TableName
ORDER BY ISNULL(NULLIF(parent, 0), '') + id ASC;
علیرضا حسن زاده
شنبه 04 تیر 1390, 09:15 صبح
داده های از نوع عددی(int) هستن در مورد ParentId هم درسته تو جدول Null قرار دادم برای رکورد های پدر
مسئله مهم فقط ترتیب نمایش رکوردها هست اون هم با دستور SQL چون این کار رو با #C و داخل نرم افزار انجام دادم ولی فکر می کنم اگه با یه دستور SQL اینکار انجام بشه بازده بهتری داشته باشه چون الان به تعدا رکورد های پدر برای رکوردهای فرزند از پایگاه داده Select انجام میدم
محمد سلیم آبادی
یک شنبه 05 تیر 1390, 03:30 صبح
نمی دونم تونستین از کد استفاده کنید یا نه.
ولی حالا که integer هست ناچاری برای استفاده از تکنیکی که معرفی شد مقادیر رو تبدیل به رشته کنی توسط یک از دو تابع Convert و Cast (البته دو مقادیر id و parentid در ماده ی Order by نه جای دیگه)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.