2011-05-17 79 views
2

我有三個MySQL表:MySql的選擇資質到期日期

用戶:用戶ID,用戶名

測試:TestId,測試名

通行證:PassId,用戶ID,TestId, DateTaken

我想返回一個表格,顯示每個用戶傳遞的最新測試日期, G。

|--------|---------|---------|---------|---------|---------| 
|User |Test A |Test B |Test C |Test D |Test E | 
|--------|---------|---------|---------|---------|---------| 
|James |Null  |6/3/11 |Null  |Null  |4/3/11 | 
|Mark |Null  |1/4/11 |8/5/11 |23/5/10 |Null  | 
|--------|---------|---------|---------|---------|---------| 

在這個例子中,詹姆斯從來沒有通過測試A,C或D.他可能已經採取試驗B幾次,但最新的是在11年6月3日。

我打算在ASP.NET GridView中顯示這些數據。什麼是最好的方法 - 可以在SELECT語句中完成?請幫忙!

非常感謝提前。

回答

3
select 
u.username, 
max(case when testid = 1 then datetaken else null end) as A, 
max(case when testid = 2 then datetaken else null end) as B, 
max(case when testid = 3 then datetaken else null end) as C, 
max(case when testid = 4 then datetaken else null end) as D, 
max(case when testid = 5 then datetaken else null end) as E 
from users as u 
left join passes as p on u.userid = p.userid 
group by u.userid 
3

要做到這一點,你需要使用子查詢爲每個測試結果 試試這個:

SELECT User, 
    (SELECT MAX(DateTaken) FROM Passes p INNER JOIN Tests t ON p.TestId=t.TestId WHERE p.UserId=u.UserId AND TestName='Test A') AS 'Test A', 
    (SELECT MAX(DateTaken) FROM Passes p INNER JOIN Tests t ON p.TestId=t.TestId WHERE p.UserId=u.UserId AND TestName='Test B') AS 'Test B', 
    (SELECT MAX(DateTaken) FROM Passes p INNER JOIN Tests t ON p.TestId=t.TestId WHERE p.UserId=u.UserId AND TestName='Test C') AS 'Test C', 
    (SELECT MAX(DateTaken) FROM Passes p INNER JOIN Tests t ON p.TestId=t.TestId WHERE p.UserId=u.UserId AND TestName='Test D') AS 'Test D', 
    (SELECT MAX(DateTaken) FROM Passes p INNER JOIN Tests t ON p.TestId=t.TestId WHERE p.UserId=u.UserId AND TestName='Test E') AS 'Test E' 
FROM Users u 
+0

+1簡單,但我做了一些修正 – 2011-05-17 21:23:23

+0

什麼修復,阿德里安?任何人都可以評論哪個答案是最高效的嗎? – James 2011-05-17 21:31:00

+1

@James Adrian有一個編輯等待批准,將userName別名爲Name。至於最有效率,我會猜測尼克rulez'。但你可以測試它們並看看 – 2011-05-17 21:36:36

2

這是非常通用的解決方案。 MySQL支持我寫的所有內容,但是可能會有更好的MySQL特定解決方案。

Select 
    UserName, 
    Max(TestA) testa, 
    Max(TestB) testb, 
    Max(TestC) testc, 
    Max(TestD) testd, 
    Max(TestE) teste 
FROM 
(



    SELECT 
     u.UserName, 
     Case When TestName = "Test A" then p.DateTaken END TestA, 
     Case When TestName = "Test B" then p.DateTaken END TestB, 
     Case When TestName = "Test C" then p.DateTaken END TestC, 
     Case When TestName = "Test D" then p.DateTaken END TestD, 
     Case When TestName = "Test E" then p.DateTaken END TestE 
    FROM 
     Users u 
     LEFT JOIN tests t 
     ON u.UserId = t.userid 
     LEFT JOIN (SELECT 
       Max(DateTaken) DateTaken, 
       userId, 
       TestId, 
      FROM 
       Passes 
      GROUP BY 
       userId, 
       TestId) p 
     ON t.testId = p.TestId) t 
Group BY 
    UserName