order by 질문 입니다 0 4 462

by 둘리눈알 [SQL Query] [2019.08.06 20:49:49]


mysql로 메뉴를 구성 중입니다.

예를 들어 1차 메뉴에 해당하는 2차 메뉴가 있고, 2차 메뉴에 해당하는 3차 메뉴가 있습니다.

ex)

메뉴1

  - 메뉴2

      - 메뉴3

메뉴1

  - 메뉴2

  - 메뉴2

이런 식으로요!

현재 테이블의 컬럼 구성은

id / parent_id / menu_level / ordering / menu_name이 있습니다. (불필요 컬럼 삭제)

 

select * from manager_menu
order by	
	(
		case when parent_id is null
			then id
		else
			parent_id
		end
	),
	menu_level
;
  id parent_id menu_level menu_code menu_name ordering url uri
1 1 null 1 test1 메뉴1 1    
2 2 1 2 test2 메뉴1-2 1    
3 3 1 2 test2 메뉴1-2 2    
4 4 2 3 test3 메뉴1-3 1    
5 5 2 3 test3 메뉴1-3 2    
6 6 null 1 test11 메뉴2 3    
7 7 6 2 test22 메뉴2-2 1    
8 8 6 2 test22 메뉴2-2 2    
9 9 6 2 test22 메뉴2-2 3    
10 10 7 3 test33 메뉴2-3 1    
11 11 9 3 test33 메뉴2-3 1    
12 12 null 1 test111 메뉴32 2    
13 13 12 2 test222 메뉴3-2 1    
14 14 13 3 test333 메뉴3-3 1    

 

select 문으로 조회를 했을 때 결과인데, 문제는 메뉴1 (parent_id가 null인 것) 끼리의 ordering 순서가 정렬이 되지 않는 것입니다.

저 조회문에서 메뉴1의 ordering 까지 정렬 하려면 쿼리를 어떻게 수정해야 할 지 감이 안잡힙니다 ㅜㅜ 

도와주시면 감사하겠습니다....

by 농부지기 [2019.08.07 10:05:54]

계층(tree)을 풀때 단순 sql문장으로 order by 해서는 정렬이 안되구요.
반드시 connect by 절을 사용해야 됩니다.
...
앗 mysql 이군요.
음~~ 그럼 with절을 통해서 connect by처럼 재귀적 호출하는 방법으로 풀어야 겠네요.
mssql 에서는 with절을 통한 재귀적 호출이 됐었는데.. mysql도 되겠죠? ㅋㅋ

connect by 절로 열심히 sql을 작성하느라 시간을 소비 했네요.
지금은 어렵고.. 시간 되는데로.. 해 볼게요.

질문자님도  'with절 통한 재귀적 호출하는 방법' 으로 googling하면 나올거에요.
함 도전해보세요.


by 둘리눈알 [2019.08.07 11:32:43]

농부지기님 감사합니다. 개인프로젝트로 진행하는 거라서 퇴근 후에 열심히 찾아보겠습니다!! 감사합니다


by 마농 [2019.08.09 08:11:48]

mysql 재귀쿼리는 8.0 부터 지원할걸요? 버전 확인해 보세요.


by 둘리눈알 [2019.08.10 10:50:34]

네 현재 mysql 버전이 5 버전이라서 8 버전으로 올릴 지 다른 방식으로 구현해볼지 고민 중입니다..!

스프링 5버전으로 개인 프로젝트 진행 중인데 mysql도 8버전으로 업그레이드 하는게 좋을까요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입