如何比较两个不同的SQL表并获得不同的值?

时间:2014-01-19 19:55:41

标签: php mysql

我对标题问题感到抱歉,我不清楚我想做什么,但我不知道如何解释,请阅读以获得进一步解释:

我有两个表,一个是'employees',它们有employeesName和employeesInTime(他们应该上班的时间)。

然后我有一个seconde表,员工记录他们上班的时间,它有行employeesName,timeIn和timeOut。

我需要做的是实施一个系统,在那里我可以看到每个员工的所有“时间”,并告诉他们是否按时,迟到或根本不去上班。

最终报告应如下所示:

Employees Name // In // Out // Month - Jan

                               1 / 2 / 3 / 4 / 5 / 6 / ......
john smith      8:00  17:00    P   P   P   L   M   P  .......

(P为及时,L为迟,M为失踪)。 当你将鼠标悬停在信件上时,它还应该告诉他们什么时候进来。

到目前为止,我得到的是一张包含所有员工的表格,以及他们应该进出的时间。

对于另一部分(月报),我完全被困住了。

我明白了:

$query2 = "select * from info where `inout`='in' ";
$result2 = mysql_query($query2);

if($result2 === FALSE) {
die(mysql_error()); // valid only on development stage for debugging
}

while($row = mysql_fetch_array($result2))
{
 $timeIn = "".$row['timestamp']."";
 $name = "".$row['fullname']."";
 $timeIn = $timeIn + @$tzo;
 echo '<strong>'.$name . '</strong>: ' . date($timefmt, $timeIn) .'<br />';
}

mysql_free_result($result2);

这给了我所有来自员工的内容,但问题是我多次得到同一个员工。对于所有员工,我需要从一名员工那里得到所有的东西。

我应该非常感谢任何指示我应该去哪个方向。我想我应该以某种方式加入两个表来获得我想要的结果,但无论我怎么认为我无法确定哪个查询将从一个员工获得所有内容,然后为所有员工获取所以它看起来像所需的表格报告。

如果在上一个问题中已经回答过这个问题,那么请指点我,我很抱歉我在这里搜索了stackoverflow,但是没有找到类似的东西。

感谢您的时间。

编辑:这是SQLFiddle

1 个答案:

答案 0 :(得分:1)

编写一个查询,返回31个月中的31个字段并不是一个好的解决方案,因此您需要一个查询,每月返回每个员工多次。

我会粗略地概述一下我会做什么,所以你也有工作,弄清楚细节:)。首先从第一个表创建一个表,每个员工都有一个数组:

$employees = array( 
    'emp1' => array('name' => 'emp1', 'in' => 8, 'out' => 16), 
    'emp2' => array(...),
     ...);

然后在第二个表中查询本月的输入和输出,并将其保存到上一个数组中:

foreach($row = mysql_fetch_array($result2)) {
    $day = ...; // count it from timestamp
    $timeOfDay = ....; // count it from timestamp
    $employees[ $row['name'] ]['checks'][$day][ $row['inout'] ] = $timeOfDay;
}

是的,这是一个复杂的数组数组。

最后,打印报告:

foreach($row = mysql_fetch_array($result2)) {
    $day = ...; // count it from timestamp
    $timeOfDay = ....; // count it from timestamp
    $employees[ $row['name'] ]['checks'][$day][ $row['inout'] ] = $timeOfDay;
}

foreach($employees as $employee) {
    print $employee['name'] . ':';
    // for loop through days, 
    // otherwise missed days would not be shown
    for( $day = 1; $day < $maxDay; $day++) {
        // it would be nice to check, whether 'in' and 'out' values both exist
        if (array_key_exists($day, $employee['checks'])) {
            if ($employee['in'] <= $employee['checks'][$day]['in'] &&
                $employee['out'] <= $employee['checks'][$day]['out']) {
                    print ' P ';
            } else {
                    print ' L ';
            }
        } else {
            print ' M ';
        }
    }
}