2010-10-18 24 views
1

我試圖寫一個MySQL表一個PHP報告不過我有點卡住我應該尋找到正確的命令......PHP/MySql報告使用distinct和group?

表結構如下:

| Int | employeeID | lessonID | date  

| 1 | 15110  | 50  | 2010-10-18 
| 2 | 15110  | 51  | 2010-10-18 
| 3 | 15110  | 52  | 2010-10-18 
| 4 | 15110  | 50  | 2010-10-18 
| 5 | 13211  | 51  | 2010-10-18 
| 6 | 13211  | 52  | 2010-10-18 
| 7 | 11542  | 60  | 2010-10-18 

因此,每次打開課程時,都會添加一個新行,其中包含employeeID和lessonID。

我想創建會顯示訪問過誰lessonID 50,51和52

例如,報告將看起來像人的報告:

| employeeID | lessonID 50 | lessonID 51 | lessonID 52 | 

    15110   Y     Y    Y 
    13211   N     Y    Y 

我有什麼至今我的SQL查詢:

SELECT DISTINCT employeeID, lessonID 

FROM elearning.el_lessonmetrics 

WHERE lessonID = 50 OR lessonID = 51 OR lessonID = 52; 

其中給出:

| employeeID | lessonID | 
    15110   50 
    15110  51 
    15110  52 
    13211  50 
    13211  51 

任何人都可以幫助我如何將這些結果形成上述報告結構?

感謝

回答

2

你要尋找的是被稱爲pivot table

有幾個可用的教程在互聯網上爲MySQL:

現在,只要您的具體問題,它取決於在ha之前是否知道課程的數量ND。如果是這樣,你可以只參加在自己每課:

SELECT a.employeeID, 
    CASE WHEN j1.lessonID IS NULL THEN 'N' ELSE 'Y' END AS `lessionID50`, 
    CASE WHEN j2.lessonID IS NULL THEN 'N' ELSE 'Y' END AS `lessionID51`, 
    CASE WHEN j3.lessonID IS NULL THEN 'N' ELSE 'Y' END AS `lessionID52` 
FROM elearning.el_lessonmetrics AS a 
    LEFT JOIN elearning.el_lessonmetrics AS j1 ON a.employeeID = j1.employeeID 
    LEFT JOIN elearning.el_lessonmetrics AS j2 ON a.employeeID = j2.employeeID 
    LEFT JOIN elearning.el_lessonmetrics AS j3 ON a.employeeID = j3.employeeID 
WHERE (j1.lessonID = 50 OR j1.lessonID IS NULL) 
    AND (j2.lessonID = 51 OR j2.lessonID IS NULL) 
    AND (j3.lessonID = 52 OR j3.lessonID IS NULL) 
GROUP BY a.employeeID 

如果你不知道的教訓數量,還是有大量的人則此方法將無法正常使用(和你很可能會關閉後處理結果的PHP構建你的表)好......

例如:

SELECT DISTINCT employeeID, lessonID 
FROM elearning.el_lessonmetrics 
WHERE lessonID IN (50, 51, 52); 

然後,在PHP

$employees = array(); 
$lessons = array(); 
while ($row = getRowFromDatabase()) { 
    $lessons[$row['lessonID']] = true; 
    $employees[$row['employeeID']][$row['lessonID']] = true; 
} 
foreach ($employees as &$employee) { 
    foreach ($lessons as $lessonId => $status) { 
     if (!isset($employee[$lessonId])) { 
      $employee[$lessonId] = false; 
     } 
    } 
} 

這會導致類似的數組:

array (
    15110 => array(
     50 => true, 
     51 => true, 
     52 => true, 
    ), 
    13211 => array(
     50 => true, 
     51 => true, 
     52 => false, 
    ), 
) 
+0

謝謝你幫我,我只是想知道,如果你能在foreach循環使用&$僱員之前澄清? 即使用戶沒有上過課,我也可以看到什麼時候回顯結果,如果你把它留在lessonID中,但是如果你把它拿出來,那麼如果用戶沒有上過這堂課,鍵就會消失。 最後一個問題:)如果我有另一張通過employeeID鏈接到僱員姓名的表,最好在迭代數組時通過單獨的查找生成一個單獨的查詢,或者您可以展開第一個sql語句以獲取該數據? – inertiahz 2010-10-19 09:57:58

+0

基本上它創建了一個[reference](http://php.net/manual/en/language.references.php)。它允許你直接改變變量(這是一個快捷方式,如果你願意的話,你可以不做參考)。你可以改變查詢來爲你取名。簡單地修改第一個連接(表別名a)到您引用的表... – ircmaxell 2010-10-19 12:37:17

+0

謝謝,我已經成功地加入表並獲得我想要的結果,現在去閱讀多維數組:p – inertiahz 2010-10-19 16:14:38