2017-12-20 5 views
1

나는 Learning, ProgramCourse과 같은 모든 유형의 데이터를 사용하여 master_data을 보유하고 있습니다. 다른 테이블 mapping은 부모/자식 관계를 알려줍니다. -> 프로그램 -> 코스매핑 테이블을 사용하여 테이블 행을 여러 부모 행에 매핑하는 방법은 무엇입니까?

이 학습은 여러 프로그램이있을 수 있습니다, 프로그램이 여러 과정이있을 수 있습니다 여기에

는 그룹/heirarichy

학습을합니다. 또한 프로그램은 여러 학습의 일부가 될 수 있으며 과정은 여러 프로그램의 일부가 될 수 있습니다.

여분의 열을 유지하여 데이터를 가져 오는 방법은 parent과 같이 부모를 식별하여 행을 그룹화하는 데 도움이됩니다.

Master_data

id title       description type 
    ---------------------------------------------------------------- 
    1 How to Present     some info Learning 
    2 Securing Data     more info Learning 
    3 Preparation plan    more info Program 
    4 Protecting System    info  Program 
    5 Presentation mediums   some info Program 
    6 know the importance    some info Course 
    7 Notice the key concepts   some info Course 
    8 Presenting in PPT    some info Course 
    9 Presenting in Video format  some info Course 
    10 Update the System    some info Course 
    11 Chose a Strong password   some info Course 

매핑

id learning_id program_id  course_id 
    ---------------- ----------- -------------- 
    1 1    3    6 
    2 1    5    6 
    3 1    3    7 
    4 1    5    8 
    5 1    5    9 
    6 2    4    6 
    7 2    4    10 
    8 2    4    11 

결과

여기
id title       description type  parent 
    ------------------------------------------------------------------------- 
    1 How to Present     some info Learning 1 (itself) 
    3 Preparation plan    more info Program 1 
    5 Presentation mediums   some info Program 1 
    6 know the importance    some info Course  3 
    7 Notice the key concepts   some info Course  3 
    8 Presenting in PPT    some info Course  5 
    9 Presenting in Video format  some info Course  5 

프로그램 3,5-가있는 PA RT 6,7는 1 과목을 배우는 것은 3을 프로그램 속하고 8,9는 MySQL의에서 위의 5

쿼리를 프로그램 속

CREATE TABLE `master_data` (
     `id` INT NOT NULL AUTO_INCREMENT, 
     `title` VARCHAR(255) NOT NULL, 
     `description` TEXT NOT NULL, 
     `type` VARCHAR(45) NOT NULL, 
     PRIMARY KEY (`id`)); 


    INSERT INTO `master_data` (`id`, `title`, `description`, `type`) VALUES 
('1', 'How to Present', 'some info', 'Learning'), 
('2', 'Securing Data', 'few more info', 'Learning'), 
('3', 'Preparation plan', 'informatoin abt this', 'Program'), 
('4', 'Protecting System', 'security info', 'Program'), 
('5', 'Presentation mediums', 'some info', 'Program'), 
('6', 'You should know the importance', 'some info', 'Course'), 
('7', 'Notice the key concepts', 'some info', 'Course'), 
('8', 'Presenting in PPT', 'some info', 'Course'), 
('9', 'Presenting in Vedio format', 'some info', 'Course'), 
('10', 'Update the System', 'some info', 'Course'), 
('11', 'Chose a Strong password', 'some info', 'Course'); 


    CREATE TABLE `mapping` (
     `id` INT NOT NULL AUTO_INCREMENT, 
     `learning_id` INT NOT NULL, 
     `program_id` INT NOT NULL, 
     `course_id` INT NOT NULL, 
     PRIMARY KEY (`id`)); 


    INSERT INTO `mapping` (`id`, `learning_id`, `program_id`, `course_id`) VALUES 
('1', '1', '3', '6'), 
('2', '1', '5', '6'), 
('3', '1', '3', '7'), 
('4', '1', '5', '8'), 
('5', '1', '5', '9'), 
('6', '2', '4', '6'), 
('7', '2', '4', '10'), 
('8', '2', '4', '11'); 
+2

샘플 결과를 질문에 추가하십시오. –

+4

학습, 프로그램 및 코스를 세 개의 서로 다른 테이블에 넣고 둘 사이에 외래 키 제약 조건을 설정해야합니다. –

+1

샘플 데이터의 예상 출력을 추가 할 수도 있습니다. –

답변

0
, 그것은 우아한 문제를 해결할 수이 쿼리 아니다

그러나 작업이 결과가 매우 큰 목록이 될 것입니다 경우 정확한 위치에 인덱스를 만들 수

SELECT *, 
(CASE 
    WHEN type = 'Learning' 
    THEN id 
    WHEN type = 'Program' 
    THEN (SELECT a.learning_id 
     FROM mapping AS A 
     WHERE a.program_id = id 
     LIMIT 1) 
    WHEN type = 'Course' 
    THEN (SELECT a.program_id 
     FROM mapping AS A 
     WHERE a.course_id = id 
     LIMIT 1) 
    END 
) AS parent 
FROM master_data; 

제안 최선을 다 가져옵니다.

+1

감사합니다 Gaurav garu. 덕분에 – Hearaman

3

당신은 UNION 절의 도움으로 그것을 할 수도 있습니다 : 당신은 데이터의 정확성과 좋은 성능을위한 장소에 적절한 제약 조건과 인덱스를 가져야한다

select id,title,description,type,id from master_data where type='Learning' 
UNION 
select program_id,title,description,type,learning_id from master_data md, mapping m where md.id=m.program_id 
UNION 
select course_id,title,description,type,program_id from master_data md, mapping m where md.id=m.course_id; 

.

+0

. 나는 유니온을 사용했다. – Hearaman