database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 31234 게시물 읽기
No. 31234
쿼리좀 만들어 주세요~
작성자
이기자(k3i2)
작성일
2019-04-30 13:36
조회수
2,912

이리 저리 해봐도 해결이 안돼서 도움을 청합니다.

데이타와 출력물은 아래와 같습니다.

 

TABLE NAME : category

-- 데이타 --
------------------------------
code    name     reid    deep
------------------------------
100    1단계a              0
200    1단계b              0
115    1단계c              0
ABC00  2단계a  100         1
ABC00  2단계a  200         1
DEC00  2단계b  100         1
FC0HG  2단계c  100         1
FC0HG  2단계c  115         1
ZSOFF  3단계a  100,ABC00   2
ZSOFF  3단계a  115,ABC00   2
ZSOFF  3단계a  200,ABC00   2
ZSOSS  3단계b  100,ABC00   2
ZSOSS  3단계b  200,DEC00   2
.
.
.

-- 출력 ---
100
  ABC00
    ZSOFF
    ZSOSS
  DEC00
    ZSOSS
  FC0HG
200
  ABC00
    ZSOFF
115
  FC0HG
    ZSOFF
.
.
.
 

code : 코드번호
name : 카테고리명
reid : 상위카테고리코드( ,로 구분 )
deep : 깊이

 

이해가 가실지는 모르겠는데,

한 20년전 프로그램의 테이블 구조라 좀 애매한 부분이 있습니다

deep이 0인것부터 1, 2... 순으로

첫번째 0부터 보여주고 그밑으로 1부터는 단계별로 아래로 펼친다음에 두번째 0...  이런식으로 보여주는겁니다.

하ㄴ개 쿼리로 방법이 있을까요?

이 글에 대한 댓글이 총 7건 있습니다.

WITH category AS
(
SELECT '100' code, '1단계a' name, null reid, 0 deep
UNION ALL SELECT '200'  , '1단계b', null       , 0
UNION ALL SELECT '115'  , '1단계c', null       , 0
UNION ALL SELECT 'ABC00', '2단계a', '100'      , 1
UNION ALL SELECT 'ABC00', '2단계a', '200'      , 1
UNION ALL SELECT 'DEC00', '2단계b', '100'      , 1
UNION ALL SELECT 'FC0HG', '2단계c', '100'      , 1
UNION ALL SELECT 'FC0HG', '2단계c', '115'      , 1
UNION ALL SELECT 'ZSOFF', '3단계a', '100,ABC00', 2
UNION ALL SELECT 'ZSOFF', '3단계a', '115,ABC00', 2
UNION ALL SELECT 'ZSOFF', '3단계a', '200,ABC00', 2
UNION ALL SELECT 'ZSOSS', '3단계b', '100,ABC00', 2
UNION ALL SELECT 'ZSOSS', '3단계b', '200,DEC00', 2
)
SELECT CONCAT(LPAD(' ', deep*2, ' '), code) code
     , CONCAT(LPAD(' ', deep*2, ' '), name) name
     , CONCAT_WS(',', reid, code) path
  FROM category
 ORDER BY path
;

마농(manon94)님이 2019-04-30 15:29에 작성한 댓글입니다.

답변 감사합니다.
근데, 예를든 데이타로 말고 테이블명과 컬럼명만을 이용한 쿼리를 원한건데...
데이타가 구조는 저렇지만 너무 다양하게 많습니다.
사실 카데고리도 deep이 4까지 있고요.

이기자(k3i2)님이 2019-05-01 07:46에 작성한 댓글입니다.

 With 문 없다고 생각하시고, 쿼리만 보시면 됩니다.

마농(manon94)님이 2019-05-01 16:16에 작성한 댓글입니다.

감사합니다.

덕분에 어느정도 해결점이 보입니다 ^^

한가지 문제가 되는게 생겼네요. T.T

각 deep별 출력은 맞게 나오는데,

문제가 데이타에 idx라는 순차번호가 있는데,

deep이 같으면, reid나 code가 아닌 이 idx값 순으로 출력이 되어야 합니다..

예를들어

------------------------
idx   reid   code  deep
------------------------
  2    ABC   BCD     1
  3    ABC   ABC     1

인경우 reid+code값으로 볼때는 ABCABC 가 앞에 나와야하지만,
idx가 뒤이기 때문에 아래에 나와야된다는거죠.
deep 1에 해당되는 아래 depp 2, 3항목은 맞게 가져옵니다.
다만 그 내에서 deep 1, 2, 3모두 같은 deep내에서 순서는 idx값으로 출력되어야 된다는거죠.

말이 좀 복잡하네요 ^^

이기자(k3i2)님이 2019-05-02 09:58에 작성한 댓글입니다.
이 댓글은 2019-05-02 10:49에 마지막으로 수정되었습니다.

MySQL 버전이 어떻게 되나요?

마농(manon94)님이 2019-05-07 00:37에 작성한 댓글입니다.

버전이 좀 낮습니다. ㅠ.ㅠ
4.1.22 입니다.

이기자(k3i2)님이 2019-05-07 13:22에 작성한 댓글입니다.

WITH category AS
(
SELECT '100' code, '1단계a' name, null reid, 0 deep, 1 idx
UNION ALL SELECT '200'  , '1단계b', null       , 0, 2
UNION ALL SELECT '115'  , '1단계c', null       , 0, 3
UNION ALL SELECT 'ABC00', '2단계a', '100'      , 1, 1
UNION ALL SELECT 'DEC00', '2단계b', '100'      , 1, 2
UNION ALL SELECT 'FC0HG', '2단계c', '100'      , 1, 3
UNION ALL SELECT 'ZSOFF', '3단계a', '100,ABC00', 2, 1
UNION ALL SELECT 'ZSOSS', '3단계b', '100,ABC00', 2, 2
UNION ALL SELECT 'ZSOSS', '3단계b', '100,DEC00', 2, 1
UNION ALL SELECT 'ABC00', '2단계a', '200'      , 1, 1
UNION ALL SELECT 'ZSOFF', '3단계a', '200,ABC00', 2, 1
UNION ALL SELECT 'FC0HG', '2단계c', '115'      , 1, 1
UNION ALL SELECT 'ZSOFF', '3단계a', '115,FC0HG', 2, 1
)
SELECT CONCAT(LPAD(' ', a.deep*2, ' '), a.code) code
     , CONCAT(LPAD(' ', a.deep*2, ' '), a.name) name
     , CONCAT_WS(',', a.reid, a.code) path
     , a.deep
     , CASE a.deep
       WHEN 0 THEN a.idx
       WHEN 1 THEN b.idx
       WHEN 2 THEN c.idx
       WHEN 3 THEN d.idx
       WHEN 4 THEN e.idx
       ELSE 0  END idx_0
     , CASE a.deep
       WHEN 1 THEN a.idx
       WHEN 2 THEN b.idx
       WHEN 3 THEN c.idx
       WHEN 4 THEN d.idx
       ELSE 0  END idx_1
     , CASE a.deep
       WHEN 2 THEN a.idx
       WHEN 3 THEN b.idx
       WHEN 4 THEN c.idx
       ELSE 0  END idx_2
     , CASE a.deep
       WHEN 3 THEN a.idx
       WHEN 4 THEN b.idx
       ELSE 0  END idx_3
     , CASE a.deep
       WHEN 4 THEN a.idx
       ELSE 0  END idx_4
  FROM category a
  LEFT OUTER JOIN category b ON a.reid = CONCAT_WS(',', b.reid, b.code)
  LEFT OUTER JOIN category c ON b.reid = CONCAT_WS(',', c.reid, c.code)
  LEFT OUTER JOIN category d ON c.reid = CONCAT_WS(',', d.reid, d.code)
  LEFT OUTER JOIN category e ON d.reid = CONCAT_WS(',', e.reid, e.code)
 ORDER BY idx_0, idx_1, idx_2, idx_3, idx_4, path
;

마농(manon94)님이 2019-05-07 16:34에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
31237테이블 조인 1:n 1:n 1:n [1]
기훈
2019-05-11
2853
31236MariaDB 와 MSSQL이 호환되는 암호화 [4]
암호화
2019-05-09
2874
31235파워빌더 파워스크립트문좀 자문 구합니다. [2]
이예성
2019-05-07
2732
31234쿼리좀 만들어 주세요~ [7]
이기자
2019-04-30
2912
31233윈도우10에 mysql 서버를 설치했는데 외부접속이 안되네요 [1]
테스트중
2019-04-28
2689
31232쿼리문 in, not in 질문 있습니다 ㅠㅠ SQL 이제 시작한 사람입니다. [4]
MySQL 초보
2019-04-25
2615
31231클라우드 서비스 환경에서의 DB 구성방안 질문
개초보
2019-04-24
3001
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다