SQL 알고리즘 정렬기
이것은 제 테이블 데이터입니다.cat_parent_id가 부모를 의미하는 0인 경우(예: 사용자 및 문화가 cat_id = 1인 부모인 경우), 직원 혜택 및 인증서는 사용자 및 문화의 자식입니다.그러나 직원 복지 및 인증에도 자녀가 있습니다.직원 복리후생 cat_id = 6. 따라서 자녀는 SSS 대출 조회이며, 인증은 cat_id = 10이며, 재직 증명서와 SSS 기부 증명서가 자녀가 됩니다.
예상 출력:
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)
언급URL : https://stackoverflow.com/questions/56881213/sql-algorithm-sorter
'programing' 카테고리의 다른 글
변수를 int 대 round() 함수에 사용 (0) | 2023.07.22 |
---|---|
변경된 값에 대해서만 트리거 (0) | 2023.07.22 |
단순한 파이썬 웹 서비스를 만드는 가장 좋은 방법 (0) | 2023.07.22 |
효율적인 순환 버퍼? (0) | 2023.07.22 |
PyTorch에서 "CUDA 메모리 부족"을 방지하는 방법 (0) | 2023.07.22 |