각 테이블의 ID로 저장된 경로정보 select하기 0 5 545

by xcrew [MySQL] mysql path [2021.10.18 17:54:14]


안녕하세요.

mysql에서 각 테이블의 ID를 가지고 PATH를 만들었습니다.

ID CODE PATH
1234 1 1,11,31,35
1235 2 1,11,38

1,11,31,35

저 PATH 정보로 테이블을 조회해서 정보를 한꺼번에 가져오고 싶습니다.

예를들어 1,11,31,35 PATH 일때는

select name1 from testA where id = 1;

select name2 from testB where id = 11;

select name3 from testC where id = 31;

select name4 from testC where id = 35;

로 조회된 각각의 이름을 가져오는 쿼리는 어떻게 가능할까요???

원하는 결과 

name1 name2 name3 name4

 

그리고 두번째 쉼표 이상 부터는 무조건 쉼표를 없애고 값을 합쳐서있는 방법이 있을까요?

PATH = 1,11,38 일때

select name from testCAR where id = 38;

PATH = 1,11,31,35 일때

select name from testCAR where id = 3135;

 

도움좀 부탁드립니니다.

by 마농 [2021.10.19 09:44:55]

path는 4개가 최대인가요?
name 정보를 가진 테이블이 3개 각각인가요? (a, b, c ?)
name 정보를 가진 테이블의 샘플 데이터도 표형태로 보여주세요.
최종 원하는 결과표도 보여주세요.


by xcrew [2021.10.19 12:32:20]

네 현재는 4개가 최대입니다!!!

name 정보를 가진 테이블이 a, b, c  각각 맞습니다.

A테이블

ID NAME
1 test1
2 test2

B테이블

ID PID NAME
11 1 sub test1
12 1 sub test2
13 2 sub test3

c테이블

ID PID NAME
31 11 my name31
32 13 my name32
33 31 my name33
34 41 my name34
35 12 my name35

위 테이블에서 PATH 정보가 1,11,31,35일때

제가 원하는데이터 입니다.

test1 sub test1 my name31 my name35

PATH 정보가 2,13,32 라면

test2 sub test3 my name32

 

PATH의 두번째 이후는 C테이블에서만 조회 되어야 합니다.

설명이 부족해서 죄송합니다.ㅠㅠ

 


by 마농 [2021.10.19 13:24:08]
WITH test_m AS
(
SELECT 1234 id, 1 code, '1,11,31,35' path
UNION ALL SELECT 1235, 2, '2,13,32'
)
, test_a AS
(
SELECT 1 id, 'test1' name
UNION ALL SELECT 2, 'test2'
)
, test_b AS
(
SELECT 11 id, 1 pid, 'sub test1' name
UNION ALL SELECT 12, 1, 'sub test2'
UNION ALL SELECT 13, 2, 'sub test3'
)
, test_c AS
(
SELECT 31 id, 11 pid, 'my name31' name
UNION ALL SELECT 32, 13, 'my name32'
UNION ALL SELECT 33, 31, 'my name33'
UNION ALL SELECT 34, 41, 'my name34'
UNION ALL SELECT 35, 12, 'my name35'
)
SELECT m.id
     , m.code
     , m.path
     , a.name name1
     , b.name name2
     , c.name name3
     , d.name name4
  FROM test_m m
 INNER JOIN test_a a
    ON SUBSTRING_INDEX(SUBSTRING_INDEX(m.path, ',', 1), ',', -1) = a.id
 INNER JOIN test_b b
    ON SUBSTRING_INDEX(SUBSTRING_INDEX(m.path, ',', 2), ',', -1) = b.id
  LEFT OUTER JOIN test_c c
    ON SUBSTRING_INDEX(SUBSTRING_INDEX(m.path, ',', 3), ',', -1) = c.id
  LEFT OUTER JOIN test_c d
    ON SUBSTRING_INDEX(SUBSTRING_INDEX(m.path, ',', 4), ',', -1) = d.id
;

 


by xcrew [2021.10.19 16:56:59]

정말 감사합니다. 덕분에 해결 되었습니다.

염치 불구 하지만 한가지 더 궁금한게 있습니다.^^;;;

C테이블기준으로 

PATH 정보가 1,11,31,35일때 뒤에 31,35의 정보로 아래와 같이 테이블을 하나더 만들었습니다.

ID PATH name pay
1 3135 my name31/my name35 1000
2 3136 my name31/my name36 2000
3 3137 my name31/my name36 3000
4 32 my name32 3500
5 33 my name33 2100
6 34 my name34 2000
7 3537 my name35/my name37 3200

이렇게 만들고 보니 PATH컬럼이 중복 값이 들어 가버리네요.

예를 들면 PATH 정보가 1,11,3,135 일때와 1,11,31,35일때  둘다 3135로 중복이 되어버리는데요.

어떻게 해결해야 할까요....

 

 

 

 


by 마농 [2021.10.19 18:00:01]

1. 구분자를 그대로 두는 방안 : (3,135) (31,35)
2. 고정자리를 사용하는 방안 : (00030135) (00310035)

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