从mySQL表中识别作业代码的变化

时间:2015-12-19 18:56:39

标签: php mysql arrays loops

我正在使用MySQL中的一个非常大的表,其中包含过去四年收集的员工信息。我想知道某个人的工作代码是否在那个时间之间发生了变化,如果是的话,将他们的数据推送到一个用于json编码的数组中。

数据的示例如下所示:

Year    Emp ID    Job Code
2015     1234         X908
2014     1234         X908
2013     1234         X908
**2015     5421         Y444**
2014     5421         Z900
2013     5421         Z900

对于员工1234,2013-2015之间没有工作变化;不过,我想抓住员工5421,其职位代码在2014年至2015年期间发生了变化。

到目前为止,我已经用PHP编写了一个脚本而没有很好的结果。

$query = mysqli_query("SELECT year, emp_id, job_code from big_table ");

$rows = array();

while ($r = mysql_fetch_assoc($query)) {

 if ($r['emp_id'] == $r['emp_id'] and $r['job_code'] != $r['job_code']) {

    $rows[] = $r;

 } 

echo json_encode($rows);

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

您可以在SQL查询中获取所需的数据,而无需将所有用户记录都提取到PHP中。这比在PHP中处理数据要有效得多。

您可以获取每个用户的工作代码计数:

SELECT emp_id, COUNT(DISTINCT job_code) AS diffjobs FROM big_table GROUP BY emp_id

然后,您可以通过将用户包含在子查询中来有条件地获取具有1个以上不同作业代码的用户:

SELECT emp_id, diffjobs FROM 
    (SELECT emp_id, COUNT(DISTINCT job_code) AS diffjobs FROM big_table GROUP BY emp_id) d
    WHERE diffjobs > 1

答案 1 :(得分:1)

此循环应该有效:

$rows = array();
$jobChanges = array();
while ($r = mysql_fetch_assoc($query)) {
  if (!isset($rows[$r['emp_id']])){
    $rows[$r['emp_id']] = $r;
  } elseif ($rows[$r['emp_id']]['job_code'] != $r['job_code']) {
    // Handle differing job_code...
    if (!isset($jobChanges[$r['emp_id'])) {
      $jobChanges[$r[emp_id]] = array();
    }
    // Keep track of all differing job codes per emp_id
    // I am not going to go any further than that...
    $jobChanges[$r[emp_id]][] = $r;
  }
}

答案 2 :(得分:1)

您可以使用GROUP BYHAVING条款获得在几年之间工作发生变化的所需员工,如下所示:

$query  = mysqli_query($link, "SELECT emp_id from big_table GROUP BY emp_id HAVING COUNT(DISTINCT job_code) > 1");

$rows = array();
while ($r = mysqli_fetch_assoc($query)){
    $rows[] = $r;
} 

echo json_encode($rows);

警告:请勿在代码中混合mysqlimysql个数据库扩展。

答案 3 :(得分:1)

这可以通过MySQL中的JOIN查询来完成,这样您只返回上一年发生变化的行 -

SELECT 
    a.year, a.emp_id, a.job_code, 
    b.year prev_year, b.job_code prev_job_code
FROM big_table a
JOIN big_table b
ON a.emp_id = b.emp_id
AND b.year = a.year-1
WHERE a.job_code != b.job_code 

请参阅此SQLFiddle - http://sqlfiddle.com/#!9/95e680/10

因此您的代码可以简化为 -

$query = mysqli_query("SELECT a.year, a.emp_id, a.job_code, b.year prev_year, b.job_code prev_job_code FROM big_table a JOIN big_table b ON a.emp_id = b.emp_id AND b.year = a.year-1 WHERE a.job_code != b.job_code ");

$rows = array();

while ($r = mysqli_fetch_assoc($query)) {

    $rows[] = $r;

 } 

echo json_encode($rows);

注意 - 您有mysqli_query(),但mysql_fetch_assoc(),所以我更新为mysqli_fetch_assoc()

如果您仍想在php中执行此操作,则需要将最后一行值保存到临时数组,然后检查job_code是否已更改。

它看起来像这样 -

$query = mysqli_query("SELECT year, emp_id, job_code from big_table ORDER BY emp_id, year");

$temp = array();    
$rows = array();

while ($r = mysqli_fetch_assoc($query)) {

 if(!isset($temp[$r['emp_id']]){

     $temp[$r['emp_id']] = $r; // add this row to the temp array

 }
 else {

     if ($r['job_code'] != $temp[$r['emp_id']]['job_code']) {

        // add the previous values for comparison
        $r['prev_year'] = $temp[$r['emp_id']]['year'];
        $r['prev_job_code'] = $temp[$r['emp_id']]['job_code'];

        // add this row
        $rows[] = $r; // add this row

        // replace the last temp array with this array
        $temp[$r['emp_id']] = $r;

     }

 } 

echo json_encode($rows);

注意 - 我通过添加ORDER BY - >更改了查询ORDER BY emp_id, year