세로 데이터를 가로로 보여주고 싶습니다. 0 4 1,714

by 경상도곰남 [MySQL] [2015.01.13 21:20:18]


CREATE TABLE `t_genealogy` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '고유번호',
  `parent_id` int(10) unsigned DEFAULT '0' COMMENT '부모번호',
  `name` varchar(50) DEFAULT NULL COMMENT '이름',
  `level` tinyint(6) NOT NULL COMMENT '세대',
  `d_sort` tinyint(4) NOT NULL COMMENT '정렬',
  PRIMARY KEY (`id`)
);

id    Parent_Id   Name    level(세대)      d_sort (정렬)
2          1          광원            1          1
4          2          강상            2          1
6          4          권장            3          1
7          6          영춘            4          1
8          7          윤정            5          1
9          8          한기            6          1
10          9          경출            7          1
11        10          언충            8          1
12        10          홍림            8          2
13        11          상기            9          1
14        11          생군            9          2
15        12          근생            9          1
16        12          원석            9          2

족보 관련 프로그램이 구현할려고 합니다.
위의 테이블 내용을 아래의 형태로 나열하고 싶습니다

1  2  3  4  5  6  7  8  9
 광원  강상  권장  영춘  윤정  한기  경출  언충  상기
                 생군
               홍림  근생
             

 

 

 원석

 

가로 행이 계속 늘어 납니다.

left outer join을 할려고 하니 가로 행이 늘어날수록 조인수가 늘어나서 속도 측면에서 많이 느려질거 같습니다.

다른 방법이 있으면 가르쳐 주십시오.. 조언 부탁드립니다.

현재 가로행은 31까지 있습니다.

아래 쿼리는 제가 만든 쿼리입니다.

SELECT t1.id id_1, 
       t1.parent_id parent_id_1, 
       t1.name name_1, 
       t1.level level_1, 
       t1.d_sort d_sort_1, 
       t2.id id_2, 
       t2.parent_id parent_id_2, 
       t2.name name_2, 
       t2.level level_2, 
       t2.d_sort d_sort_2, 
       t3.id id_3, 
       t3.parent_id parent_id_3, 
       t3.name name_3, 
       t3.level level_3, 
       t3.d_sort d_sort_3, 
       t4.id id_4, 
       t4.parent_id parent_id_4, 
       t4.name name_4, 
       t4.level level_4, 
       t4.d_sort d_sort_4, 
       t5.id id_5, 
       t5.parent_id parent_id_5, 
       t5.name name_5, 
       t5.level level_5, 
       t5.d_sort d_sort_5, 
       t6.id id_6, 
       t6.parent_id parent_id_6, 
       t6.name name_6, 
       t6.level level_6, 
       t6.d_sort d_sort_6, 
       t7.id id_7, 
       t7.parent_id parent_id_7, 
       t7.name name_7, 
       t7.level level_7, 
       t7.d_sort d_sort_7, 
       t8.id id_8, 
       t8.parent_id parent_id_8, 
       t8.name name_8, 
       t8.level level_8, 
       t8.d_sort d_sort_8, 
       t9.id id_9, 
       t9.parent_id parent_id_9, 
       t9.name name_9, 
       t9.level level_9, 
       t9.d_sort d_sort_9, 
       t10.id id_10, 
       t10.parent_id parent_id_10, 
       t10.name name_10, 
       t10.level level_10, 
       t10.d_sort d_sort_10, 
       t11.id id_11, 
       t11.parent_id parent_id_11, 
       t11.name name_11, 
       t11.level level_11, 
       t11.d_sort d_sort_11, 
       t12.id id_12, 
       t12.parent_id parent_id_12, 
       t12.name name_12, 
       t12.level level_12, 
       t12.d_sort d_sort_12, 
       t13.id id_13, 
       t13.parent_id parent_id_13, 
       t13.name name_13, 
       t13.level level_13, 
       t13.d_sort d_sort_13, 
       t14.id id_14, 
       t14.parent_id parent_id_14, 
       t14.name name_14, 
       t14.level level_14, 
       t14.d_sort d_sort_14, 
       t15.id id_15, 
       t15.parent_id parent_id_15, 
       t15.name name_15, 
       t15.level level_15, 
       t15.d_sort d_sort_15, 
       t16.id id_16, 
       t16.parent_id parent_id_16, 
       t16.name name_16, 
       t16.level level_16, 
       t16.d_sort d_sort_16, 
       t17.id id_17, 
       t17.parent_id parent_id_17, 
       t17.name name_17, 
       t17.level level_17, 
       t17.d_sort d_sort_17, 
       t18.id id_18, 
       t18.parent_id parent_id_18, 
       t18.name name_18, 
       t18.level level_18, 
       t18.d_sort d_sort_18, 
       t19.id id_19, 
       t19.parent_id parent_id_19, 
       t19.name name_19, 
       t19.level level_19, 
       t19.d_sort d_sort_19, 
       t20.id id_20, 
       t20.parent_id parent_id_20, 
       t20.name name_20, 
       t20.level level_20, 
       t20.d_sort d_sort_20, 
       t21.id id_21, 
       t21.parent_id parent_id_21, 
       t21.name name_21, 
       t21.level level_21, 
       t21.d_sort d_sort_21, 
       t22.id id_22, 
       t22.parent_id parent_id_22, 
       t22.name name_22, 
       t22.level level_22, 
       t22.d_sort d_sort_22, 
       t23.id id_23, 
       t23.parent_id parent_id_23, 
       t23.name name_23, 
       t23.level level_23, 
       t23.d_sort d_sort_23, 
       t24.id id_24, 
       t24.parent_id parent_id_24, 
       t24.name name_24, 
       t24.level level_24, 
       t24.d_sort d_sort_24, 
       t25.id id_25, 
       t25.parent_id parent_id_25, 
       t25.name name_25, 
       t25.level level_25, 
       t25.d_sort d_sort_25, 
       t26.id id_26, 
       t26.parent_id parent_id_26, 
       t26.name name_26, 
       t26.level level_26, 
       t26.d_sort d_sort_26, 
       t27.id id_27, 
       t27.parent_id parent_id_27, 
       t27.name name_27, 
       t27.level level_27, 
       t27.d_sort d_sort_27, 
       t28.id id_28, 
       t28.parent_id parent_id_28, 
       t28.name name_28, 
       t28.level level_28, 
       t28.d_sort d_sort_28, 
       t29.id id_29, 
       t29.parent_id parent_id_29, 
       t29.name name_29, 
       t29.level level_29, 
       t29.d_sort d_sort_29, 
       t30.id id_30, 
       t30.parent_id parent_id_30, 
       t30.name name_30, 
       t30.level level_30, 
       t30.d_sort d_sort_30, 
       t31.id id_31, 
       t31.parent_id parent_id_31, 
       t31.name name_31, 
       t31.level level_31, 
       t31.d_sort d_sort_31, 
       t32.id id_32, 
       t32.parent_id parent_id_32, 
       t32.name name_32, 
       t32.level level_32, 
       t32.d_sort d_sort_32, 
       t33.id id_33, 
       t33.parent_id parent_id_33, 
       t33.name name_33, 
       t33.level level_33, 
       t33.d_sort d_sort_33 
  FROM 
       (SELECT * 
         FROM t_genealogy 
        WHERE level = 1 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t1 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t2 
         ON t2.parent_id = t1.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t3 
         ON t3.parent_id = t2.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t4 
         ON t4.parent_id = t3.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t5 
         ON t5.parent_id = t4.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t6 
         ON t6.parent_id = t5.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t7 
         ON t7.parent_id = t6.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t8 
         ON t8.parent_id = t7.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t9 
         ON t9.parent_id = t8.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t10 
         ON t10.parent_id = t9.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t11 
         ON t11.parent_id = t10.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t12 
         ON t12.parent_id = t11.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t13 
         ON t13.parent_id = t12.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t14 
         ON t14.parent_id = t13.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t15 
         ON t15.parent_id = t14.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t16 
         ON t16.parent_id = t15.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t17 
         ON t17.parent_id = t16.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t18 
         ON t18.parent_id = t17.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t19 
         ON t19.parent_id = t18.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t20 
         ON t20.parent_id = t19.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t21 
         ON t21.parent_id = t20.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t22 
         ON t22.parent_id = t21.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t23 
         ON t23.parent_id = t22.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t24 
         ON t24.parent_id = t23.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t25 
         ON t25.parent_id = t24.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t26 
         ON t26.parent_id = t25.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t27 
         ON t27.parent_id = t26.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t28 
         ON t28.parent_id = t27.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t29 
         ON t29.parent_id = t28.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t30 
         ON t30.parent_id = t29.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t31 
         ON t31.parent_id = t30.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t32 
         ON t32.parent_id = t31.id 
     LEFT OUTER JOIN 
       (SELECT * 
         FROM t_genealogy 
     ORDER BY level, 
              parent_id, 
              d_sort
       ) AS t33 
         ON t33.parent_id = t32.id  

 

by 마농 [2015.01.14 09:00:39]

위에 작성하신 부분은
각각을 모두 정렬 인라인뷰로 감싼 것은 잘못입니다.
그냥 테이블 그대로 조인하시면 됩니다.
또한 모든 항목(id, pid, nm, lv)을 레벨별로 다 나열한 것도 잘못입니다.
(id, nm)만 쭈욱 나열하시면 되겠네요.


오라클과 달리 MySQL 은 계층쿼리를 지원하지 않습니다.
http://explainextended.com/2009/03/17/hierarchical-queries-in-mysql/


by 경상도곰남 [2015.01.14 22:25:55]

링크 페이지를 참조해서 실행을 해보니 속도 측면에서 조인을 사용한것 보다 훨신 빠르기는 한데

트리구조로 나타나서 제가 원하는 형태로 만들기가 어렵네요..

위에 제가 예제로 만든 형태로 만들기는 어려운 건가요?

조언 부탁드립니다.

 


by 마농 [2015.01.14 10:52:51]
SELECT t01.id id_01, t01.name name_01
     , t02.id id_02, t02.name name_02
     , t03.id id_03, t03.name name_03
     , t04.id id_04, t04.name name_04
     , t05.id id_05, t05.name name_05
     , t06.id id_06, t06.name name_06
     , t07.id id_07, t07.name name_07
     , t08.id id_08, t08.name name_08
     , t09.id id_09, t09.name name_09
     , t10.id id_10, t10.name name_10
     , t11.id id_11, t11.name name_11
     , t12.id id_12, t12.name name_12
     , t13.id id_13, t13.name name_13
     , t14.id id_14, t14.name name_14
     , t15.id id_15, t15.name name_15
     , t16.id id_16, t16.name name_16
     , t17.id id_17, t17.name name_17
     , t18.id id_18, t18.name name_18
     , t19.id id_19, t19.name name_19
     , t20.id id_20, t20.name name_20
     , t21.id id_21, t21.name name_21
     , t22.id id_22, t22.name name_22
     , t23.id id_23, t23.name name_23
     , t24.id id_24, t24.name name_24
     , t25.id id_25, t25.name name_25
     , t26.id id_26, t26.name name_26
     , t27.id id_27, t27.name name_27
     , t28.id id_28, t28.name name_28
     , t29.id id_29, t29.name name_29
     , t30.id id_30, t30.name name_30
     , t31.id id_31, t31.name name_31
  FROM t_genealogy t01
  LEFT OUTER JOIN t_genealogy t02 ON t01.id = t02.parent_id
  LEFT OUTER JOIN t_genealogy t03 ON t02.id = t03.parent_id
  LEFT OUTER JOIN t_genealogy t04 ON t03.id = t04.parent_id
  LEFT OUTER JOIN t_genealogy t05 ON t04.id = t05.parent_id
  LEFT OUTER JOIN t_genealogy t06 ON t05.id = t06.parent_id
  LEFT OUTER JOIN t_genealogy t07 ON t06.id = t07.parent_id
  LEFT OUTER JOIN t_genealogy t08 ON t07.id = t08.parent_id
  LEFT OUTER JOIN t_genealogy t09 ON t08.id = t09.parent_id
  LEFT OUTER JOIN t_genealogy t10 ON t09.id = t10.parent_id
  LEFT OUTER JOIN t_genealogy t11 ON t10.id = t11.parent_id
  LEFT OUTER JOIN t_genealogy t12 ON t11.id = t12.parent_id
  LEFT OUTER JOIN t_genealogy t13 ON t12.id = t13.parent_id
  LEFT OUTER JOIN t_genealogy t14 ON t13.id = t14.parent_id
  LEFT OUTER JOIN t_genealogy t15 ON t14.id = t15.parent_id
  LEFT OUTER JOIN t_genealogy t16 ON t15.id = t16.parent_id
  LEFT OUTER JOIN t_genealogy t17 ON t16.id = t17.parent_id
  LEFT OUTER JOIN t_genealogy t18 ON t17.id = t18.parent_id
  LEFT OUTER JOIN t_genealogy t19 ON t18.id = t19.parent_id
  LEFT OUTER JOIN t_genealogy t20 ON t19.id = t20.parent_id
  LEFT OUTER JOIN t_genealogy t21 ON t20.id = t21.parent_id
  LEFT OUTER JOIN t_genealogy t22 ON t21.id = t22.parent_id
  LEFT OUTER JOIN t_genealogy t23 ON t22.id = t23.parent_id
  LEFT OUTER JOIN t_genealogy t24 ON t23.id = t24.parent_id
  LEFT OUTER JOIN t_genealogy t25 ON t24.id = t25.parent_id
  LEFT OUTER JOIN t_genealogy t26 ON t25.id = t26.parent_id
  LEFT OUTER JOIN t_genealogy t27 ON t26.id = t27.parent_id
  LEFT OUTER JOIN t_genealogy t28 ON t27.id = t28.parent_id
  LEFT OUTER JOIN t_genealogy t29 ON t28.id = t29.parent_id
  LEFT OUTER JOIN t_genealogy t30 ON t29.id = t30.parent_id
  LEFT OUTER JOIN t_genealogy t31 ON t30.id = t31.parent_id
 WHERE t01.level = 1
 ORDER BY t01.d_sort, t02.d_sort, t03.d_sort, t04.d_sort, t05.d_sort
        , t06.d_sort, t07.d_sort, t08.d_sort, t09.d_sort, t10.d_sort
        , t11.d_sort, t12.d_sort, t13.d_sort, t14.d_sort, t15.d_sort
        , t16.d_sort, t17.d_sort, t18.d_sort, t19.d_sort, t20.d_sort
        , t21.d_sort, t22.d_sort, t23.d_sort, t24.d_sort, t25.d_sort
        , t26.d_sort, t27.d_sort, t28.d_sort, t29.d_sort, t30.d_sort
        , t31.d_sort
;

 


by 경상도곰남 [2015.01.14 21:21:20]

속도가 장난이 아니네요 ^^

속도 때문에 몇일 고민했었는데 ...

답변 너무 감사합니다.

정말 많은 도움이 되었습니다.

 

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