programing

SQL 알고리즘 정렬기

powerit 2023. 7. 22. 10:29
반응형

SQL 알고리즘 정렬기

이것은 제 테이블 데이터입니다.cat_parent_id가 부모를 의미하는 0인 경우(예: 사용자 및 문화가 cat_id = 1인 부모인 경우), 직원 혜택 및 인증서는 사용자 및 문화의 자식입니다.그러나 직원 복지 및 인증에도 자녀가 있습니다.직원 복리후생 cat_id = 6. 따라서 자녀는 SSS 대출 조회이며, 인증은 cat_id = 10이며, 재직 증명서와 SSS 기부 증명서가 자녀가 됩니다.

enter image description here

예상 출력:

Admin and Facilities
  • Safety and Security Related Concerns
     • CCTV Footage

Information Technology
  • User Account
     • Enable / Disable Access

People and Culture
     • Certification
        • Certificate of Employment
        • SSS Certificate of Employment
     • Employee Benefits Request
        • SSS Loan Inquiry

지금은 운이 없는 상황입니다.

SELECT category.cat_id AS catId, category.cat_parent_id AS catParentId, 
subcategory.cat_id AS subcatId,subcategory.cat_parent_id AS subcatParentId,
category.cat_name,
CONCAT( IFNULL(subcategory.cat_parent_id, category.cat_parent_id), 
category.cat_parent_id, category.cat_id, category.cat_name) AS sorter
FROM ticket_categories AS category
LEFT JOIN ticket_categories AS subcategory ON subcategory.cat_parent_id = 
category.cat_id
GROUP BY category.cat_id
ORDER BY sorter

주요 목표는 상위 항목별(첫 번째 우선 순위), 범주(두 번째 우선 순위), 하위 범주(세 번째 우선 순위) 순으로 데이터를 정렬하는 것입니다.나는 내 별명 분류기를 가지고 놀고 있지만, 작동할 수 없습니다.

MySQL 8 이전 버전에서는 재귀 쿼리가 까다롭습니다.이 경우 레벨이 3개(0, 1 및 2)밖에 없는 것으로 보이므로 루트에서 각 노드로 경로를 가져오기 위해 테이블을 여러 번 자동으로 조인하는 것이 좋습니다.

마지막으로 루트에서 자식으로 이어지는 "경로"의 이름 연결을 정렬합니다.

select a.cat_id, a.cat_level, a.cat_name, 
    concat(
        ifnull(concat(c.cat_name, '  '), ''),
        ifnull(concat(b.cat_name, '  '), ''),
        a.cat_name) as cat_order
from ticket_categories a
left join ticket_categories b on b.cat_id = a.cat_parent_id 
left join ticket_categories c on c.cat_id = b.cat_parent_id 
order by cat_order;

이 쿼리를 쉽게 확장하여 더 많은 수준을 지원할 수 있습니다. 추가하면 됩니다.left join줄 및 테이블 별칭 및 확장concat그에 따른 표현

MySQL 8에서는 임의의 수준을 처리할 수 있는 재귀 쿼리를 사용할 수 있습니다.

with recursive cte(cat_id, cat_level, cat_name, cat_order) as (
  select cat_id, cat_level, cat_name, cat_name
  from ticket_categories
  where cat_parent_id = 0
  union
  select t.cat_id, t.cat_level, t.cat_name, concat(cte.cat_order, '  ', t.cat_name)  
  from cte
  inner join ticket_categories t on t.cat_parent_id = cte.cat_id
)
select * from cte
order by cat_order;

두 쿼리 모두에 대한 출력:

cat_id | cat_level | cat_name                             | cat_order
-------+-----------+--------------------------------------+-------------------------------------------------------------------------------
   3   |     0     | Admin and Facilities                 | Admin and Facilities
   4   |     1     | Safety and Security Related Concerns | Admin and Facilities  Safety and Security Related Concerns
   9   |     2     | CCTV Footage Request                 | Admin and Facilities  Safety and Security Related Concerns  CCTV Footage Request
   2   |     0     | Information Technology               | Information Technology
   5   |     1     | User Account                         | Information Technology  User Account
   8   |     2     | Enable / Disable Access              | Information Technology  User Account  Enable / Disable Access
   1   |     0     | People and Culture                   | People and Culture
  10   |     1     | Certification                        | People and Culture  Certification
  11   |     2     | Certificate of Employment            | People and Culture  Certification  Certificate of Employment
  12   |     2     | SSS Certificate of Contributions     | People and Culture  Certification  SSS Certificate of Contributions

경로에서 구분자로 이중 공간이 사용됩니다(cat_order이름에 두 개의 공백이 없을 것으로 가정합니다.만약 당신이 그랬다면, 당신의 이름 중 하나가 다른 하나의 접두사인 경우, 주문이 잘못될 수도 있습니다.

최종 들여쓰기 형식은 다음을 사용합니다.cat_level기둥.하지만 제 생각에는 그런 일은 SQL에 속하지 않습니다. 비록 그것은 쉽게 할 수 있습니다.

concat(repeat('  ', cat_level), cat_name)

두 쿼리 모두에 대한 DB 피들입니다.

언급URL : https://stackoverflow.com/questions/56881213/sql-algorithm-sorter

반응형