2012-11-13 3 views
1

세 개의 테이블, 사용자 테이블, test_sessions 테이블 및 코스 테이블이 있습니다.복잡한 쿼리를 생성하는 MySQL

전체 사용자 목록이있는 보고서를 만들어야합니다. courses 테이블에서 일부 코스는 'track'= 1 필드를 갖습니다. 1과 같으면 보고서의 해당 코스에 대한 열이 필요합니다.

test_sessions 테이블에는 user_id 및 course_id뿐만 아니라 complete_date 필드가 있습니다.

나는이 작업을 수행 할 수있는 단일 쿼리를 작성 할 수 있도록하려는
______|Tracked Course 1|Tracked Course 2 |Tracked Course 3 
User 1|complete date |complete date |complete date 
User 2|complete date |complete date |complete date 
User 3|complete date |complete date |complete date 

, 그것은 가능하다 : 나는 이런 식으로 뭔가를 필요로하는 보고서에 대한

?

+0

당신이 우리에게 그들의 몇 가지 테스트 값으로 세 개의 테이블의 디자인을 보여줄 수 보는가? – Blueboye

답변

2

이것은 기본적으로 PIVOT이지만 MySQL에는 PIVOT이 없으므로 집계와 CASE 문을 사용하여 복제해야합니다. 당신은 당신의 값을 얻기 위해 원하는 코스 이름을 알고있는 경우 하드 코딩 할 수 그것을 : 당신이 과정을 알 수없는 번호가있는 경우

select u.userName, 
    max(case when c.coursename = 'Course 1' then s.completed_date end) Course1, 
    max(case when c.coursename = 'Course 2' then s.completed_date end) Course2, 
    max(case when c.coursename = 'Course 3' then s.completed_date end) Course3 
from users u 
left join test_sessions s 
    on u.user_id = s.user_id 
left join courses c 
    on s.course_id = c.course_id 
group by u.username 

SQL Fiddle with Demo

를 참조하십시오, 당신은 준비된 문을 사용할 수 있습니다 이과 유사한

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(case when c.coursename = ''', 
     coursename, 
     ''' then s.completed_date end) AS ', 
     coursename 
    ) 
) INTO @sql 
FROM courses; 

SET @sql = CONCAT('SELECT u.userName, ', @sql, ' 
        from users u 
        left join test_sessions s 
        on u.user_id = s.user_id 
        left join courses c 
        on s.course_id = c.course_id 
        group by u.username'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle with demo

관련 문제