【问题标题】:how to retrieve huge data from mysql database with multiple table using php如何使用php从具有多个表的mysql数据库中检索大量数据
【发布时间】:2020-05-11 10:06:37
【问题描述】:

我需要特定部门的月度出勤报告。在我的程序中,生成需要更多时间。如果超过 50 名员工,则根本不会生成报告。

我有两张表,一张是员工表,另一张是出勤表。

我正在生成这样的报告。

这是我的代码。

<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&nbsp;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>

请指导我该怎么做,以便我能快速掌握更多员工数据。我必须一次显示 1000 名员工的记录。

【问题讨论】:

    标签: php mysql database dataset


    【解决方案1】:

    您应该连接这些表并对所有员工和一个月中的所有日期进行一次查询,而不是对每个员工和日期进行单独的查询。

    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'] 发生变化,就开始一个新的&lt;tr&gt;

    此外,当您循环查看某个员工的月份日期时,请从当前日期中减去上一个日期。如果差值大于 1,则在行中插入 $difference - 1 &lt;td&gt;A&lt;/td&gt; 列以显示缺勤情况。

    或查看generate days from date range。您可以使用其中一种技术来创建一个子查询,以生成该月中的所有日期。用这个左加入employee_attendance 表,你会得到每一天的行,但如果他们不存在,a.Attendance 将是NULL

    【讨论】:

    • 感谢@Barmar,它就像魅力一样。但是哪个日期出勤率不存在该列显示为空白。我想填写为缺席 (A)。
    • 感谢@Barmar 的帮助。另一个建议如果从日期和结束日期开始,那么将如何获得结果?例如。从日期 - 20/09/2020 到 19/10/2020
    • 我不明白这个问题。 “如果从日期和结束日期是”?
    • 你的意思是如果日期范围跨越不同的月份?仅使用一个 $Year$Month 变量是不会发生这种情况的。如果您需要其他日期范围,则需要使用日期算术而不是仅比较月份中的日期。
    • 是的,日期范围跨越不同的月份。我将手动传递起始日期和截止日期。
    猜你喜欢
    • 2016-08-17
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2014-04-10
    • 2016-03-29
    • 1970-01-01
    • 2015-07-08
    相关资源
    最近更新 更多