格式化返回结果集的方式&用PHP显示

时间:2014-02-25 19:46:29

标签: php mysql sql

我提前为标题道歉,我真的不知道怎么说出来。

一张表,如下所述:

employee_id int(11) unsigned    NO  MUL 0    
location    int(11) NO  MUL 0    
job_id  int(1)  NO  MUL 0    
current tinyint(1)  NO  MUL 1    
previous    varchar(45) NO           
access  timestamp   NO      CURRENT_TIMESTAMP   on update CURRENT_TIMESTAMP

job_id有3种可能的选择:1,2或3,current为1或0表示有效或无效。

此表中的记录存储如下:

employee_id  location job_id  current        updated
100001          19         1    0       2014-02-25 11:31:39
100001          19         3    1       2014-02-24 09:53:24
100001          18         1    0       2014-02-25 11:31:39
100001          18         3    1       2014-02-24 09:53:24

如您所见,员工每个工作地点最多可以有三条记录。

我遇到的问题是在PHP中以表格格式显示这个问题,如果查询的编写方式不同,我不确定它是否能正常工作。

Example Image 在上面的示例中,员工已在作业1中处于活动状态。为作业2添加记录时,该位置是重复的,因此从技术上讲,该员工的单个设施可能有3条记录。我的目标是在一行上显示所有三个作业(如果存在多个记录),如果它们不存在,则显示红色X,它在单击时触发Ajax以在该作业中创建记录。

为清楚起见,这三个图标表示该员工是:

  1. 活跃于这项工作(绿色检查)
  2. 在这份工作中,但不活跃(蓝人)
  3. 此作业中未激活(无记录)
  4. 我找到的唯一替代方案是每个位置有一个记录,有三个工作字段。

2 个答案:

答案 0 :(得分:1)

如果您将其视为透视查询,这实际上有点简单。使用MAX(CASE...)之类的构造来标识每个员工/位置列的每个作业,并将结果折叠为单行。使用两个条件和ELSE,每个作业都会显示active,inactiveNULL。使用应用程序代码中的那些来归类正确的图标。

SELECT 
  employee_id,
  location,
  /* the MAX() aggregate reduces multiple NULLs per group to one row
     since each job_id will produce mostly nulls if unmatched by the current CASE
     for this column */
  MAX(CASE
       WHEN job_id = 1 AND current = 1 THEN 'active'
       WHEN job_id = 1 AND current = 0 THEN 'inactive'
       ELSE NULL
      END) AS job1,
  MAX(CASE
       WHEN job_id = 2 AND current = 1 THEN 'active'
       WHEN job_id = 2 AND current = 0 THEN 'inactive'
       ELSE NULL
      END) AS job2,
  MAX(CASE
       WHEN job_id = 3 AND current = 1 THEN 'active'
       WHEN job_id = 3 AND current = 0 THEN 'inactive'
       ELSE NULL
      END) AS job3
FROM jobs
GROUP BY 
  location,
  employee_id

抱歉 - 我试图设置一个SQLfiddle,但该网站目前无法正常运行。在我自己的数据库中进行快速测试会产生如下结果:

+-------------+----------+----------+------+--------+
| employee_id | location | job1     | job2 | job3   |
+-------------+----------+----------+------+--------+
|      100001 |       18 | inactive | NULL | active |
|      100001 |       19 | inactive | NULL | active |
+-------------+----------+----------+------+--------+

答案 1 :(得分:0)

为什么不只有一个工作表,每一行都是不同的工作。在每个作业行中,您可以展开它以查看列出位置名称的位置子表和指示状态的图标(以及您需要的任何其他列)。

这将允许您特定于作业及其在每个位置的状态。它会阻止您限制在多少个工作和位置。它还允许您执行特定于作业的其他操作,如编辑或删除内联。

您应该有一个工作表,一个用于位置,一个用于员工,一个连接表将一个员工连接到一个具有日期时间戳的作业,一个连接表将该工作连接到它拥有的每个位置,在该地点与该工作有关的任何其他相关信息。