نمایش نتایج 1 تا 9 از 9

نام تاپیک: پیدا کردن والد های یک فرزند

  1. #1
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,970

    Question پیدا کردن والد های یک فرزند

    سلام وقت بخیر دوستان یک سری متن هست که به صورت رابطه فرزندی و والدی به صورت (آی دی - والد-متن) ذخیره شده.



    حالا من میام یه سری متن جستجو میکنم مثلا 10 ردیف خروجی میده که فلان آی دی ها متن های مورد جستجوی شما رو داره.

    حالا خواسته من از این نتایج این هست که هر ردیفی که تو جستجو میاره سلسه مراتبی که به این فرزند میاره هم نشون بدم.
    ممنون میشم راهکاری برای این مورد برام بفرمایید.

  2. #2
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    461

    نقل قول: پیدا کردن والد های یک فرزند

    برای نمایش سلسله مراتبی فرزندان هر ردیف که به متن جستجوی شما مربوط می‌شود، می‌توانید از یک ساختار داده مانند درخت استفاده کنید. در این ساختار، هر گره (Node) شامل اطلاعات ردیف (آی دی و متن) و فرزندان آن می‌باشد. مثلا :

    public class Node{
    public int Id { get; set; }
    public string Text { get; set; }
    public List<Node> Children { get; set; }


    public Node(int id, string text)
    {
    Id = id;
    Text = text;
    Children = new List<Node>();
    }
    }




    سپس، با استفاده از این کلاس، درختی از گره‌ها بسازید و سپس جستجوی موردی را انجام دهید. در هر مرحله، اگر یک گره با متن مورد جستجو پیدا شود، این گره را به همراه زیردرخت آن را نمایش دهید. بعنوان مثال :

    // ساخت درخت از گره‌ها
    Node root = new Node(1, "Root"); // گره اصلی


    Node child1 = new Node(2, "Child 1"); // فرزندان گره اصلی
    Node child2 = new Node(3, "Child 2");
    Node child3 = new Node(4, "Child 3");


    Node grandchild1 = new Node(5, "Grandchild 1"); // فرزندان گره Child 1
    Node grandchild2 = new Node(6, "Grandchild 2");


    child1.Children.Add(grandchild1);
    child1.Children.Add(grandchild2);


    root.Children.Add(child1);
    root.Children.Add(child2);
    root.Children.Add(child3);


    // جستجو و نمایش سلسله مراتبی فرزندان
    string searchText = "متن جستجوی شما";
    SearchAndDisplayHierarchy(root, searchText);


    // تابع جستجو و نمایش سلسله مراتبی فرزندان
    public void SearchAndDisplayHierarchy(Node node, string searchText)
    {
    if (node.Text.Contains(searchText))
    {
    DisplayHierarchy(node);
    }


    foreach (Node child in node.Children)
    {
    SearchAndDisplayHierarchy(child, searchText);
    }
    }


    // تابع نمایش سلسله مراتبی فرزندان
    public void DisplayHierarchy(Node node, string indent = "")
    {
    Console.WriteLine(indent + node.Text);


    foreach (Node child in node.Children)
    {
    DisplayHierarchy(child, indent + " ");
    }
    }


    در این کد، یک درخت ساخته شده و سپس با استفاده از تابع SearchAndDisplayHierarchy و تابع DisplayHierarchy، سلسله مراتبی فرزندان ردیف‌هایی که متن جستجوی شما را دارند نمایش داده می‌شه. اگر این نمونه با نوع سوالتان مطابقت داشت کد را با داده‌های واقعی و ساختار فرزندی خودتان سفارشی کنید.
    این توضیحات درک من از نوع سوال شما هست امیدوارم کمک کنه.
    آخرین ویرایش به وسیله پرستو پارسایی : جمعه 31 شهریور 1402 در 09:48 صبح

  3. #3
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,970

    نقل قول: پیدا کردن والد های یک فرزند

    نقل قول نوشته شده توسط پرستو پارسایی مشاهده تاپیک
    برای نمایش سلسله مراتبی فرزندان هر ردیف که به متن جستجوی شما مربوط می‌شود، می‌توانید از یک ساختار داده مانند درخت استفاده کنید. در این ساختار، هر گره (Node) شامل اطلاعات ردیف (آی دی و متن) و فرزندان آن می‌باشد.
    در این کد، یک درخت ساخته شده و سپس با استفاده از تابع SearchAndDisplayHierarchy و تابع DisplayHierarchy، سلسله مراتبی فرزندان ردیف‌هایی که متن جستجوی شما را دارند نمایش داده می‌شه. اگر این نمونه با نوع سوالتان مطابقت داشت کد را با داده‌های واقعی و ساختار فرزندی خودتان سفارشی کنید.
    این توضیحات درک من از نوع سوال شما هست امیدوارم کمک کنه.
    ممنون از راهنماییتون . این دیتا ها داخل دیتابیس ذخیره شده و حجم بالایی داره. و روز به روز هم داره تعدادش بالا میره و واکشی اطلاعات و ایجاد این کلاس فکر نکنم منطقی باشه.
    داده ها عین منو چند سطحی ذخیره شده (آی دی - آی دی والد- متن) ممکنه سطحی اصلا زیر مجموعه نداشته باشه و ممکنه تا ده سطح هم پیش بره. شما فکر کنید در حال حاضر 50 هزار رکورد هست که فعلا در حال رشد هست.
    خودم ایده ای که دارم اینه که بعد از هر جستجو کاربر بیاد و با یک کلید دیگه روی هر ردیف ساختار پدر فرزندی که به این نود میرسه رو دوباره جستجو بزنه!.

  4. #4
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    72
    پست
    3,578

    نقل قول: پیدا کردن والد های یک فرزند

    یک راه هم اینه که حجم دیتابیس رو فدای سرعت کنین!

    یک فیلد دیگه به جدول اضافه کنین به اسم path و در همون زمان insert/update مسیر رو هم بسازین و در اون ذخیره کنین.
    چون مسیر parent هر node از قبل مشخصه، زمانبر هم نیست و اگر batch هم باشه سرعت کم نمیشه،
    چون کافی هست parent به مسیر parent اضافه و در مسیر child ذخیره بشه.

    از طرفی،
    شاید نگرانی شما برای رکوردی های زیاد چندان موردی نداشته باشه.
    المانهای فایل های html یا گره های xml هم ساختا مشابه دارن و parserها سریع در اونها جستجو میکنن و تازه اینها دیتابیس هم نیستن.

    شاید اگر یک دیتابیس تست با چند میلیون رکورد بسازین و شرایط جستجو رو شبیه سازی کنین نگرانی رفع بشه،
    و همین کد پست 2 که پیشنهاد هوش ساختگی هست، ممکنه مناسب باشه (یا با ویرایش درست بشه).
    چون بیشتر اینها رو بر اساس دیتابیس learn مایکروسافت و پاسخ های پذیرفته شده جاهایی مثل stackoverflow میاره.
    به هر حال پرسش شما از نوعی هست که قبلا برای خیلی ها پیش آمده و معمولا برای اینها جواب های خوبی پیدا میشه.

  5. #5
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,970

    نقل قول: پیدا کردن والد های یک فرزند

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

    یک فیلد دیگه به جدول اضافه کنین به اسم path و در همون زمان insert/update مسیر رو هم بسازین و در اون ذخیره کنین.
    چون مسیر parent هر node از قبل مشخصه، زمانبر هم نیست و اگر batch هم باشه سرعت کم نمیشه،
    چون کافی هست parent به مسیر parent اضافه و در مسیر child ذخیره بشه.

    از طرفی،
    شاید نگرانی شما برای رکوردی های زیاد چندان موردی نداشته باشه.
    المانهای فایل های html یا گره های xml هم ساختا مشابه دارن و parserها سریع در اونها جستجو میکنن و تازه اینها دیتابیس هم نیستن.

    شاید اگر یک دیتابیس تست با چند میلیون رکورد بسازین و شرایط جستجو رو شبیه سازی کنین نگرانی رفع بشه،
    و همین کد پست 2 که پیشنهاد هوش ساختگی هست، ممکنه مناسب باشه (یا با ویرایش درست بشه).
    چون بیشتر اینها رو بر اساس دیتابیس learn مایکروسافت و پاسخ های پذیرفته شده جاهایی مثل stackoverflow میاره.
    به هر حال پرسش شما از نوعی هست که قبلا برای خیلی ها پیش آمده و معمولا برای اینها جواب های خوبی پیدا میشه.

    چون جدول ساخته شده فعلا امکانش نیست بیام فیلد مسیر رو اضافه کنم و مسیر هر والد رو براشون بنویسم. (تعداد زیاده)

    داده های من مثل جدول زیر هستند
    Screenshot 2023-10-01 134010.png

    الان میخوام دنبال کلمه Ali بگردم
    نتایجی که بدست میارم رو میخوام این ستون رو هم داشته باشه که این ردیفی که پیدا کرده از چه مسیری به این رسیده یعنی پدر های این ردیف رو هم برام بنویسه.

  6. #6
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    72
    پست
    3,578

    Find all Parent IDs / Names in a hierarchical table - SQL

    من یک دیتابیس نمونه از تقسیمات کشوری دارم
    که پنج جدول اصلی داره : states - counties - divisions - cities - villages

    از روی این 5 جدول، یک جدول Locations ساختم که ساختارش مشابه جدول شماست (parent-child hierarchical)

    روی همین دیتا توضیح میدم روش کار رو - شما برای مسئله خودتون تغییر بدین.

    1.png

    همینجور که میبینین در زمان ساخت این جدول مسیر IDها و Locationها هم در جدول ساخته شده (فیلدهای Path و $Path) ،
    بنابراین با جستجوی یک location همزمان هر دو مسیر رو هم داریم و نیازی به کار دیگه ای نیست:
    2.png

  7. #7
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    72
    پست
    3,578

    Find all Parent IDs / Names in a hierarchical table recursively - SQL

    فرض میکنیم که به هر دلیلی امکان ساخت فیلدهای Path و $Path نیست.

    میتونیم یک stored procedure بنویسیم که با گرفتن یک ID ، بصورت recursive تمام رکوردهای parent رو برگردونه:
    USE [Iran]
    GO

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE PROCEDURE [dbo].[GetParents]
    @ID int
    AS
    BEGIN
    SET NOCOUNT ON;

    WITH All_Parents(ID) AS
    (
    SELECT ParentID FROM Locations WHERE ID=@ID
    UNION ALL
    SELECT L.ParentID
    FROM All_Parents
    INNER JOIN Locations AS L
    ON All_Parents.ID=L.ID
    )

    SELECT L.ID, L.ParentID, L.[Location]
    FROM All_Parents
    INNER JOIN Locations AS L
    ON All_Parents.ID = L.ID
    END
    GO


    بعنوان نمونه، در تصویر دوم پست قبلی برای ردیف 9 با ID=1029852 خواهیم داشت:
    4.png
    EXEC GetParents    @ID = 1029852


    3.png

  8. #8
    کاربر دائمی آواتار mazoolagh
    تاریخ عضویت
    اردیبهشت 1384
    سن
    72
    پست
    3,578

    Find Path of all Parent IDs / Names in a hierarchical table recursively - SQL

    همچنین میتونیم بجای برگرداندن رکوردها، مسیرها رو برگردونیم:
    USE [Iran]
    GO

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    CREATE PROCEDURE [dbo].[GetParentsPath]
    @ID int
    AS
    BEGIN
    SET NOCOUNT ON;

    WITH All_Parents(ID) AS
    (
    SELECT ParentID FROM Locations WHERE ID=@ID
    UNION ALL
    SELECT L.ParentID
    FROM All_Parents
    INNER JOIN Locations AS L
    ON All_Parents.ID=L.ID
    )

    SELECT
    STRING_AGG (RESULTS.ID , '/') AS [PATH],
    STRING_AGG (RESULTS.[Location] , '/') AS [PATH$]
    FROM
    (SELECT L.ID AS ID, L.ParentID, L.[Location]
    FROM All_Parents
    INNER JOIN Locations AS L
    ON All_Parents.ID = L.ID) AS RESULTS

    END
    GO


    EXEC GetParentsPath    @ID = 1029852


    5.png

  9. #9
    کاربر دائمی آواتار رامین مرادی
    تاریخ عضویت
    اردیبهشت 1389
    محل زندگی
    آذربایجان
    پست
    1,970

    نقل قول: Find Path of all Parent IDs / Names in a hierarchical table recursively - SQL

    نقل قول نوشته شده توسط mazoolagh مشاهده تاپیک
    همچنین میتونیم بجای برگرداندن رکوردها، مسیرها رو برگردونیم:
    ممنون به روش کوئری بازگشتی انجام دادم. (recursive ) دستتون درد نکنه بابت وقتی که گذاشتید

تاپیک های مشابه

  1. پاسخ: 0
    آخرین پست: سه شنبه 18 اسفند 1394, 03:20 صبح
  2. پاسخ: 0
    آخرین پست: سه شنبه 10 شهریور 1394, 12:36 عصر
  3. پاسخ: 0
    آخرین پست: شنبه 25 آذر 1391, 09:45 صبح
  4. پاسخ: 1
    آخرین پست: پنج شنبه 05 خرداد 1390, 21:45 عصر
  5. کامپوننت تغییر کد پیج سینا به کد پیجهای فارسی ویندوز ؟
    نوشته شده توسط mahdi939 در بخش کامپوننت های سایر شرکت ها، و توسعه کامپوننت
    پاسخ: 2
    آخرین پست: یک شنبه 08 خرداد 1384, 19:53 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •