我有一张桌子
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
,我希望输出看起来
我获取了所有数据,然后对它们进行分页,但是对于大量数据来说这是不行的
尝试这样
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;