2012-11-15 160 views
0

讓我從事實上,我仍然是一種新的PHP/MySQL的事實。格式化MySQL查詢結果

我試圖建立一個系統,可以用來記錄完成的客戶跟蹤工作號碼,客戶名稱,設備,日期和員工分配到任務的工作。

我有一個表設置來處理員工的分配,但我似乎無法弄清楚如何以我想要的方式格式化結果。

可能有多名員工在幾天內被分配到相同的工作。所以我設置像一個表:

job_ID | employee_name | date_worked | hours_worked 
    1  |  Dave  | 2010-1-2 |  4.5 
    1  |  Dave  | 2010-1-3 |  4.0 
    1  |  Mike  | 2010-1-2 |  6.0 
    2  |  Bill  | 2011-5-7 |  8.0 
    2  |  Bill  | 2011-5-8 |  6.5 
    2  |  Dave  | 2011-5-7 |  4.0 
    2  |  Dave  | 2011-5-8 |  4.5 

我正在尋找的結果做的就是輸出它想:

Job # = 1 
    Employee | 2010-1-2 | 2010-1-3 | 
     Dave |  4.5 |  4.0 | 
     Mike |  6.0 |  0  | 

    Job # = 2 
    Employee | 2011-5-7 | 2011-5-8 | 
     Bill |  8.0 |  6.5 | 
     Dave |  4.0 |  4.5 | 

任何人都可以提供意見?

編輯

好了,我想我留下了一些信息。

我有一個表(job_list),用於保存記錄。

該表記錄了JOB_ID,客戶端,設備,位置,通話日期,回覆日期,竣工日期等

然後,我有一個表(employee_list),通過ID和名稱列出所有員工。

我之前發佈的表格背後的想法是隻記錄誰在哪裏,在哪一天以及多長時間。

我修改了我張貼的表以employee_id。

我想在php中顯示結果看起來像我發佈的輸出。我只是不知道該怎麼做。

我可以提供哪些其他信息?我需要什麼張貼道歉我缺乏瞭解: -/

如果我的做法完全是太可怕了,我沒有說我還是新來這...

+2

[你有什麼嘗試?](http://www.whathaveyoutried.com/) –

+0

「employee_name」,真的嗎?你應該有一個單獨的表來存儲僱員的細節,hours_worked應該有它自己的表,這樣你就可以設置誰/小時工作/工作..你想在PHP中顯示結果?是這個問題,我很困惑!你把你的表格弄錯了。 – Phorce

+0

你應該調整你的佈局(只是一個想法) 表:工作 - JOB_ID - JOB_NAME - job_description - ... 表:員工 - 僱員標識 - employee_name - ... 表:工作 - employee_id - job_id - date - 工作時間 –

回答

1

這基本上是一個PIVOT但MySQL沒有PIVOT函數,因此您需要使用匯總函數和CASE語句來複制它。如果你知道所有你想要轉換的值的查詢將類似於此:

select employee_name, 
    sum(case when date_worked = '2010-01-02' then hours_worked else 0 end) `2010-01-02`, 
    sum(case when date_worked = '2010-01-03' then hours_worked else 0 end) `2010-01-03` 
from yourtable 
group by employee_name 

SQL Fiddle with Demo

結果是:

| EMPLOYEE_NAME | 2010-01-02 | 2010-01-03 | 
------------------------------------------- 
|   Bill |   0 |   0 | 
|   Dave |  4.5 |   4 | 
|   Mike |   6 |   0 | 

如果你有一個未知號碼的值,那麼你可以使用準備好的語句來動態生成這個:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'sum(case when date_worked = ''', 
     date_worked, 
     ''' then hours_worked else 0 end) AS `', 
     date_worked, '`' 
    ) 
) INTO @sql 
FROM yourtable; 

SET @sql = CONCAT('SELECT employee_name, ', @sql, ' 
        FROM yourtable 
        GROUP BY employee_name'); 

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

SQL Fiddle with Demo

兩者都會產生相同的結果。