格式化MySQL查询结果

时间:2012-11-15 21:19:02

标签: php mysql

让我先谈谈我仍然是php / 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中显示结果,看起来像我发布的输出。我只是不知道该怎么做。

我可以提供哪些其他信息?我对我需要发布的内容缺乏了解表示歉意: - /

如果我的方法完全可怕,我确实说我还是新手......

1 个答案:

答案 0 :(得分: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

两者都会产生相同的结果。