如何通过分页获取递归数据

问题描述 投票:0回答:1

我有一张桌子

category

id 名字 parent_id
1 博客 0
2 活动新闻 0
3 招聘 0
4 技术 1
5 运动 1
6 企业文化 2
7 娱乐 1
8 3
9 艺术 1
10 足球 5
11 乒乓球 5
12 会计师 3

如何使用分页查询递归数据。 例如:

limit = 5
,我希望输出看起来 like this

我获取了所有数据,然后对它们进行分页,但是对于大量数据来说这是不行的

mysql recursion pagination
1个回答
0
投票

尝试这样

WITH  RECURSIVE EmployeeHierarchy AS (
   ( SELECT DISTINCT
        ee.id,
        generated_dates::date AS date,
        ud.title AS designation_name,
        CONCAT(ou.first_name, ' ', ou.last_name) AS name,
        epp.employee_image,
        CASE
            WHEN extract(dow FROM date(dates)) IN (0, 6) THEN 'W'
            WHEN ua.created_at IS NULL AND ele.start_date IS NOT NULL AND
                (generated_dates::date BETWEEN ele.start_date::date AND ele.end_date::date) AND
                ele.status = 'approved' AND elt.is_half_leave = false THEN 'L'
            WHEN ua.created_at IS NOT NULL AND ele.start_date IS NOT NULL AND
                (generated_dates::date BETWEEN ele.start_date::date AND ele.end_date::date) AND
                ele.status = 'approved' AND elt.is_half_leave = false THEN 'L'
            WHEN ele.start_date IS NOT NULL AND ua.created_at IS NOT NULL AND ele.status = 'approved' AND
                elt.is_half_leave = true THEN 'PL'
            WHEN ele.start_date IS NOT NULL AND ua.created_at IS NULL AND ele.status = 'approved' AND
                elt.is_half_leave = true THEN 'AL'
            WHEN ua.created_at IS NULL THEN 'A'
            WHEN ua.created_at IS NOT NULL THEN 'P'
            ELSE 'A'
        END AS status,
        0 AS level
    FROM generate_series(
        DATE_TRUNC('MONTH', CURRENT_DATE)::DATE,
        CURRENT_DATE,
        '1 day'
    ) AS generated_dates(dates)
    JOIN employee_employee ee ON true = true
    LEFT JOIN enterprise_designation ud ON ud.id = ee.designation_id
    LEFT JOIN em_attendances ua ON ua.employee_id = ee.id AND ua.created_at::date = generated_dates::date
    LEFT JOIN em_leaves ele ON ele.employee_id = ee.id AND (ele.start_date::date <= generated_dates::date AND ele.end_date::date >= generated_dates::date) AND ele.status = 'approved'
    LEFT JOIN em_leavetypes elt ON elt.id = ele.leave_type_id
    LEFT JOIN oms_user ou ON ou.id = ee.user_id
    LEFT JOIN employee_profile_profile epp ON ee.id = epp.employee_id
    LEFT JOIN oms_user_roles ous ON ee.user_id = ous.user_id
    LEFT JOIN oms_role omr ON omr.id = ous.role_id
    WHERE ee.id = 'f2c1f939-a9d6-49b4-a880-2bf6b6f4b3e2' AND ee.is_active = true AND ee.is_deleted = false
    ORDER BY ee.id)

    UNION ALL

    (SELECT DISTINCT
        employee.id,
        generated_dates::date AS date,
        ud.title AS designation_name,
        CONCAT(ou.first_name, ' ', ou.last_name) AS name,
        epp.employee_image,
        CASE
            WHEN extract(dow FROM date(dates)) IN (0, 6) THEN 'W'
            WHEN ua.created_at IS NULL AND ele.start_date IS NOT NULL AND
                (generated_dates::date BETWEEN ele.start_date::date AND ele.end_date::date) AND
                ele.status = 'approved' AND elt.is_half_leave = false THEN 'L'
            WHEN ua.created_at IS NOT NULL AND ele.start_date IS NOT NULL AND
                (generated_dates::date BETWEEN ele.start_date::date AND ele.end_date::date) AND
                ele.status = 'approved' AND elt.is_half_leave = false THEN 'L'
            WHEN ele.start_date IS NOT NULL AND ua.created_at IS NOT NULL AND ele.status = 'approved' AND
                elt.is_half_leave = true THEN 'PL'
            WHEN ele.start_date IS NOT NULL AND ua.created_at IS NULL AND ele.status = 'approved' AND
                elt.is_half_leave = true THEN 'AL'
            WHEN ua.created_at IS NULL THEN 'A'
            WHEN ua.created_at IS NOT NULL THEN 'P'
            ELSE 'A'
        END AS status,
        0 AS level
    FROM generate_series(
        DATE_TRUNC('MONTH', CURRENT_DATE)::DATE,
        CURRENT_DATE,
        '1 day'
    ) AS generated_dates(dates)
    JOIN employee_employee employee ON true = true
    LEFT JOIN enterprise_designation ud ON ud.id = employee.designation_id
    LEFT JOIN em_attendances ua ON ua.employee_id = employee.id AND ua.created_at::date = generated_dates::date
    LEFT JOIN em_leaves ele ON ele.employee_id = employee.id AND (ele.start_date::date <= generated_dates::date AND ele.end_date::date >= generated_dates::date) AND ele.status = 'approved'
    LEFT JOIN em_leavetypes elt ON elt.id = ele.leave_type_id
    LEFT JOIN oms_user ou ON ou.id = employee.user_id
    LEFT JOIN employee_profile_profile epp ON employee.id = epp.employee_id
    LEFT JOIN oms_user_roles ous ON employee.user_id = ous.user_id
    LEFT JOIN oms_role omr ON omr.id = ous.role_id
    JOIN EmployeeHierarchy eh ON employee.supervisor_id = eh.id)
)

SELECT
    jsonb_build_object(
        'id', employee_info.id,
        'name', employee_info.name,
        'designation_name', employee_info.designation_name,
        'employee_image', employee_info.employee_image,
        'attendance_list', jsonb_agg(
            jsonb_build_object(
                'status', employee_info.status,
                'date', employee_info.date::text
            ) ORDER BY employee_info.date
        )
    ) AS employee_info
FROM (
    SELECT
        eh.id,
        eh.name,
        eh.designation_name,
        eh.employee_image,
        eh.date,
        eh.status
    FROM EmployeeHierarchy eh
    ORDER BY eh.id
) AS employee_info
GROUP BY employee_info.id, employee_info.name, employee_info.designation_name, employee_info.employee_image;
© www.soinside.com 2019 - 2024. All rights reserved.