2013-07-27 19 views
0

由於我嘗試了下面的內容,但無法使其工作。 我有不同日子出席現場學生的表格。我知道它需要如下的交叉表查詢。特別是我想在Codeigniter中做到這一點。MySQL在Codeigniter中使用CrossTab將行轉換爲列

att_2_2013 
| student_id| att_date  | 
-----+-----+----------+-----+----- 
| 1  |  2013-07-10| 
| 2  |  2013-07-10| 
| 3  |  2013-07-10| 
| 1  |  2013-07-11| 
| 2  |  2013-07-11| 
| 4  |  2013-07-11| 
| 2  |  2013-07-12| 
| 3  |  2013-07-12| 
| 4  |  2013-07-12| 
| 1  |  2013-07-13| 
| 3  |  2013-07-13| 
| 4  |  2013-07-13| 

我想它的結果是:

attendance TABLE 
| student_id| 2013-07-10 |2013-07-11|2013-07-12|2013-07-13 
-----+-----+----------+-----+----------+-----+----------+-----+----- 
| 1  |  P |P   |   P|   A 
| 2  |  P |P   |   A|   P 
| 3  |  A |P   |   P|   P 
| 4  |  P |A   |   P|   P 

我試着用這樣的:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(IF(`att_date` = "', `att_date`,'","P","A")) AS ', `att_date`) 
) INTO @sql 
FROM att_2_2013; 

SET @sql = CONCAT('SELECT student_id, ', @sql, ' 
        FROM att_2_2013 
        GROUP BY student_id');  
SELECT @sql; 

它生成的查詢:

SELECT  student_id, MAX(IF(`att_date` = "2013-07-24","P","A")) AS "2013-07-24",MAX(IF(`att_date` = "2013-07-25","P","A")) AS "2013-07-25",MAX(IF(`att_date` = "2013-07-10","P","A")) AS "2013-07-10",MAX(IF(`att_date` = "2013-07-11","P","A")) AS "2013-07-11",MAX(IF(`att_date` = "2013-07-12","P","A")) AS "2013-07-12",MAX(IF(`att_date` = "2013-07-15","P","A")) AS "2013-07-15" 
FROM att_2_2013 
GROUP BY student_id 

但是,這在某種程度上給這個錯誤: Unk '字段列表'中的列'att_date' 我不知道查詢是否正常。請給一些方向。我感謝您的幫助!

+0

做2個查詢:在PHP構建它會更容易 – ahmad

+0

@ahmad但我想動態地做到這一點,所以我不想運行2個查詢。任何其他方式? – Anupal

回答

0

檢查之後,你好像缺少查詢報價

這裏的工作版本:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'MAX(IF(`att_date` = "', `att_date`,'","P","A")) AS ', '"', `att_date` , '"') 
) INTO @sql 
FROM att_2_2013; 

SET @sql = CONCAT('SELECT student_id, ', @sql, ' 
        FROM att_2_2013 
        GROUP BY student_id'); 
SELECT @sql;