我正在使用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);
提前感谢您的帮助!
答案 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 BY
和HAVING
条款获得在几年之间工作发生变化的所需员工,如下所示:
$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);
警告:请勿在代码中混合mysqli
和mysql
个数据库扩展。
答案 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