2012-11-13 64 views
1

我有三個表,一個用戶表,test_sessions表和一個課程表。MySQL創建一個複雜的查詢

我需要創建一個包含用戶完整列表的報表。在課程表中,有些課程的「track」= 1。如果它等於1,那麼在報告中需要一個專欄。

test_sessions表具有complete_date字段以及user_id和course_id。

對於我需要像這樣的報告:

______|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