如何用php从多表mysql数据库中检索海量数据
我需要某个部门的每月出勤报告。在我的程序中,将需要更多的时间来生成。如果超过50名员工,则根本不会生成报告 我有两张表,一张是员工表,另一张是考勤表 我正在生成这样的报告 这是我的密码如何用php从多表mysql数据库中检索海量数据,php,mysql,database,dataset,Php,Mysql,Database,Dataset,我需要某个部门的每月出勤报告。在我的程序中,将需要更多的时间来生成。如果超过50名员工,则根本不会生成报告 我有两张表,一张是员工表,另一张是考勤表 我正在生成这样的报告 这是我的密码 <div class="row"> <div class="col-md-12"> <table style="width:100%;" border="1">
<div class="row">
<div class="col-md-12">
<table style="width:100%;" border="1">
<tr style="font-weight: bold; background-color: #D3D3D3; text-align: center;">
<td style="text-align: center;padding: 5px;">
SLNo.
</td>
<td>EMPID</td>
<td style="width:250px; text-align: center; padding-left: 5px; padding-right: 5px;">
Employee Name
</td>
<?php
/* Default Date Indexing starts here. */
$timezone = "Asia/Calcutta";
date_default_timezone_set($timezone);
$timestamp = mktime(0,0,0,$Month,1,$Year);
$maxday = date("t",$timestamp);
//echo "<td></td>";
for ($k=1; $k<= $maxday; $k++) {
$kv = sprintf('%02d', $k);
echo "<td style=''>$kv</td>";
}
/* Default Date Indexing ends here. */
?>
<td>TOT.P</td>
<td>TOT.HLF</td>
<td>TOT.A</td>
<td>TOT.WO</td>
<td>TOT.HLD</td>
</tr>
<?php
//Getting all employee details according roster assign table.
$sqlRA = "SELECT * from employee_details where DivisionDbKey = '$DivisionDbKey' and Status='ACTIVE' ORDER BY EmployeeName ASC";
$resultRA = mysqli_query($conn, $sqlRA);
$i = 1;
while ($rowRA = mysqli_fetch_array($resultRA, MYSQLI_ASSOC)) {
$EmployeeDbKey = $rowRA['DbKey'];
$EmployeeId = $rowRA['EmployeeId'];
$EmployeeName = $rowRA['EmployeeName'];
echo "<tr>";
echo "<td style='text-align:center;'>$i</td>";
echo "<td style='width:200px;'>$EmployeeId</td>";
echo "<td>$EmployeeName</td>";
$PCount = 0;$ACount = 0;$HLFCount = 0;$WOCount=0;$HLDCount=0;
for ($kk=1; $kk<= $maxday; $kk++) {
$kkv = sprintf('%02d', $kk);
$CurrentOPDate = $kkv."/".$Month."/".$Year;
$sqlRAD = "SELECT * from employee_attendance where EmployeeDbKey = '$EmployeeDbKey' and Date ='$CurrentOPDate' and Status='ACTIVE'";
$resultRAD = mysqli_query($conn, $sqlRAD);
$rowcountRAD = mysqli_num_rows($resultRAD);
if ($rowcountRAD != 0) {
while ($rowRAD = mysqli_fetch_array($resultRAD, MYSQLI_ASSOC)) {
$Attendance = $rowRAD['Attendance'];
$colorcode="";
if($Attendance == "P" || $Attendance == "p"){
$PCount = $PCount + 1;
$colorcode = "background-color:#00C0EF; color:#FFF;";
}
elseif ($Attendance == "WO" || $Attendance == "wo" || $Attendance == "Wo") {
$WOCount = $WOCount + 1;
$colorcode = "background-color:#2980B9; color:#FFF;";
}
elseif ($Attendance =="HLD" || $Attendance =="hld" || $Attendance == 'Hld') {
$HLDCount = $HLDCount + 1;
$colorcode = "background-color:#FFD455;color:#000;";
}
elseif ($Attendance == "HLF" || $Attendance == "hlf" || $Attendance == "Hlf") {
$HLFCount = $HLFCount + 1;
$colorcode = "background-color:#931336; color:#FFF;";
}
elseif ($Attendance == "A" || $Attendance == "a") {
$ACount = $ACount + 1;
$colorcode = "background-color:#F00; color:#FFF;";
}
else {
}
echo "<td style='text-align:center;font-weight:bold;$colorcode' title=''>$Attendance</td>";
}
}
else{
$ACount = $ACount + 1;
$colorcode = "background-color:#F00; color:#FFF;";
echo "<td style='text-align:center;font-weight:bold;$colorcode'>A</td>";
}
}
?>
<td style="text-align: center;font-weight: bold;color:#F00;"><?php echo $PCount; ?></td>
<td style="text-align: center;font-weight: bold;color:#F00;"><?php echo $HLFCount; ?></td>
<td style="text-align: center;font-weight: bold;color:#F00;"><?php echo $ACount; ?></td>
<td style="text-align: center;font-weight: bold;color:#F00;"><?php echo $WOCount; ?></td>
<td style="text-align: center;font-weight: bold;color:#F00;"><?php echo $HLDCount; ?></td>
<?php
echo "</tr>";
$i = $i + 1;
}
?>
</table>
</div>
</div>
斯莱诺。
埃皮德
员工姓名
您应该加入这些表,并对所有员工和当月的所有日期执行单个查询,而不是对每个员工和日期执行单独的查询
SELECT e.EmployeeId, e.EmployeeName, a.Date, a.Attendance
FROM employee_details AS e
JOIN employee_attendance AS a ON a.EmployeeDbKey = e.DbKey
WHERE e.DivisionDbKey = '$DivisionDbKey' and e.Status='ACTIVE'
AND a.Date BETWEEN '$Year-$Month-01' AND LAST_DAY('$Year-$Month-01') and a.Status='ACTIVE'
ORDER BY e.EmployeeName, a.Date
然后,在显示表时,只要$row['EmployeeId']
发生更改,就启动一个新的
此外,当您循环查看员工当月的日期时,请从当前日期中减去上一个日期。如果差异大于1,则在行中插入$difference-1
A
列以显示缺勤情况
或者看看。您可以使用其中一种技术来创建一个子查询,该子查询生成当月的所有日期。用这个左键加入employee\u考勤
表,你会得到每天的行数,但是a.如果他们不在,考勤
将为NULL
。谢谢@Barmar,效果很好。但该列显示为空白的日期不存在。我想填补缺席的空缺(A)。谢谢你帮助@Barmar。还有一个建议,如果起始日期和结束日期是,那么将如何获得结果?从2020年9月20日到2020年10月19日,我不明白这个问题。“如果开始日期和结束日期为”?您的意思是如果日期范围跨越不同的月份?只有一个$Year
和$Month
变量就不会发生这种情况。如果您需要其他日期范围,则需要使用日期算术,而不仅仅是比较月份的日期。是的,日期范围跨越不同的月份。我将手动传递起始日期和截止日期。