PHP MYSQL将结果放入一个表中

PHP MYSQL将结果放入一个表中,php,html,mysql,for-loop,Php,Html,Mysql,For Loop,我有一个返回以下内容的PHP/MySQL查询: array ( 'name' => 'Jess', 'month' => '2020-03-31 12:28:00', 'count' => '1', ) array ( 'name' => 'Bob', 'month' => '2020-04-31 12:28:00', 'count' => '2', ) array ( 'name' => 'Tom', 'month' => '2020-05-31

我有一个返回以下内容的PHP/MySQL查询:

array ( 'name' => 'Jess', 'month' => '2020-03-31 12:28:00', 'count' => '1', )
array ( 'name' => 'Bob', 'month' => '2020-04-31 12:28:00', 'count' => '2', )
array ( 'name' => 'Tom', 'month' => '2020-05-31 12:28:00', 'count' => '2', )
array ( 'name' => 'Bob', 'month' => '2020-05-31 12:28:00', 'count' => '2', )
月份以有序方式返回(例如,一月记录总是在二月记录之前)。 但是,并非每个用户每个月都会有结果(见上文)

我希望我的数据在html表格中显示如下:

Month Jess Bob Tom
March   1   
April       2   
May         2   2
以下是我的(非工作)尝试:


只是一个快速更新。通过下面的代码,我成功地得到了我想要的

<?php

/*loop through all customers and print out each induvidual users performance*/


$con = mysqli_connect("localhost","root","","perfmon");

if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit();
}


//main query for customer names
if ($customers = mysqli_query($con, "SELECT Distinct(customer_name) FROM slog ORDER BY customer_name DESC;")) {

    while($row=mysqli_fetch_assoc($customers))
    {
        //Name of customer
        $name = $row["customer_name"];
        //Print customer name
        print("<b>".$name." </b><br>");
        //Used to display total jobs
        $total = 0;


        $user_list = array("Month");
        $monthlist = array();
        $st_array = array();

        
        
            //Loop over the customer names, and pull the modified count per user.
            if ($user_perf = mysqli_query($con, "select modified_by as name, created_date as month, count(modified_by) as count from slog where customer_name = '$name' group by modified_by, MONTH(created_date) order by month;")) {

                while($row=mysqli_fetch_assoc($user_perf))
                {
                    $month = date("F",strtotime($row["month"]));
                    $name = $row["name"];
                    $count = $row["count"];
                    $total +=  $row["count"];   
                    
                    //make our left column (months)
                    if(!in_array($month, $monthlist)){
                        array_push($monthlist, $month);
                    }
                    
                    //Collect all unqiue users, to make our headers array. also stores the order theyre in.
                    if(!in_array($name, $user_list)){
                        array_push($user_list, $name);
                    }
                    
                    //make a 2d array of all data 
                    $tmp = [$month, $name, $count];
                    array_push($st_array, $tmp);
                    
                }
                
                /**Process fetched data **/
            
                $row = "";
                $previous_pos = 1; 
                $fe = True;
                
                //Print each unique user as a table header
                print("<table border='1'>");
                print("<tr>");
                foreach ($user_list as $th){
                    print("<th>".$th."</th>");
                }
                print("</tr>");
                
                //Loop the month array
                foreach ($monthlist as $td){
                    //Loop the user array
                    foreach ($user_list as $usr){
                        //Loop our "2d" array (an array containing Month,User,Count)
                        foreach($st_array as $array_2d){
                            
                            //If we match the correct month and user, return the count value. This ensures the users return in the correct order.
                            if ($array_2d[0] == $td && $array_2d[1] == $usr){
                                
                                //Pos - Get the current position of the selected user.
                                //Establish how many empty entries need to come before. E.g. User in col 1 has no empty entries infront. User in column2 has 1 entry empty infront (if column 1 is empty).
                                $pos = array_search($usr, $user_list);
                                if ($previous_pos != $pos){
                                    
                                    $row .= str_repeat("<td>0</td>", ($pos-$previous_pos-1));

                                }
                                //Assign our previous position
                                $previous_pos = $pos;
                                
                                //If our first entry isn't in column 1, add an extra 0.
                                if($pos!==1 && $fe)
                                    $row .= "<td>0</td>";
                                $fe = False;
                                //Add the data
                                $row .= "<td>".($array_2d[2])."</td>";  //change to [1] for debug
                            }
                            
                        }
                    }
                    
                    //Print the table row.
                    print("<tr><td>".$td ."</td>" . $row ."</tr>");
                    //Reset our variables.
                    $row = "";
                    $fe=True;
                    $previous_pos = 1;
                    $first_result  = True;
                }
                print("</table></br>");
                mysqli_free_result($user_perf);

            }

    }

  mysqli_free_result($customers);
}
mysqli_close($con);

?>

现在是学习如何使用
JOIN
s
$tr.=”的时候了$本月。“
将此更改为
$tr.=”$本月。"";嗨,Prateik,这似乎并没有解决问题:嗨,Cid,你能扩展JOIN的吗?我完全支持学习,所以如果你能推荐我应该在哪里使用连接,那么我将开始学习。。。感谢在循环中形成数据库查询通常被认为是一种不好的做法。不要先选择用户,然后再为循环中的每个用户选择数据,而应该首先在一个查询中将所需的所有数据连接在一起。
<?php

/*loop through all customers and print out each induvidual users performance*/


$con = mysqli_connect("localhost","root","","perfmon");

if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  exit();
}


//main query for customer names
if ($customers = mysqli_query($con, "SELECT Distinct(customer_name) FROM slog ORDER BY customer_name DESC;")) {

    while($row=mysqli_fetch_assoc($customers))
    {
        //Name of customer
        $name = $row["customer_name"];
        //Print customer name
        print("<b>".$name." </b><br>");
        //Used to display total jobs
        $total = 0;


        $user_list = array("Month");
        $monthlist = array();
        $st_array = array();

        
        
            //Loop over the customer names, and pull the modified count per user.
            if ($user_perf = mysqli_query($con, "select modified_by as name, created_date as month, count(modified_by) as count from slog where customer_name = '$name' group by modified_by, MONTH(created_date) order by month;")) {

                while($row=mysqli_fetch_assoc($user_perf))
                {
                    $month = date("F",strtotime($row["month"]));
                    $name = $row["name"];
                    $count = $row["count"];
                    $total +=  $row["count"];   
                    
                    //make our left column (months)
                    if(!in_array($month, $monthlist)){
                        array_push($monthlist, $month);
                    }
                    
                    //Collect all unqiue users, to make our headers array. also stores the order theyre in.
                    if(!in_array($name, $user_list)){
                        array_push($user_list, $name);
                    }
                    
                    //make a 2d array of all data 
                    $tmp = [$month, $name, $count];
                    array_push($st_array, $tmp);
                    
                }
                
                /**Process fetched data **/
            
                $row = "";
                $previous_pos = 1; 
                $fe = True;
                
                //Print each unique user as a table header
                print("<table border='1'>");
                print("<tr>");
                foreach ($user_list as $th){
                    print("<th>".$th."</th>");
                }
                print("</tr>");
                
                //Loop the month array
                foreach ($monthlist as $td){
                    //Loop the user array
                    foreach ($user_list as $usr){
                        //Loop our "2d" array (an array containing Month,User,Count)
                        foreach($st_array as $array_2d){
                            
                            //If we match the correct month and user, return the count value. This ensures the users return in the correct order.
                            if ($array_2d[0] == $td && $array_2d[1] == $usr){
                                
                                //Pos - Get the current position of the selected user.
                                //Establish how many empty entries need to come before. E.g. User in col 1 has no empty entries infront. User in column2 has 1 entry empty infront (if column 1 is empty).
                                $pos = array_search($usr, $user_list);
                                if ($previous_pos != $pos){
                                    
                                    $row .= str_repeat("<td>0</td>", ($pos-$previous_pos-1));

                                }
                                //Assign our previous position
                                $previous_pos = $pos;
                                
                                //If our first entry isn't in column 1, add an extra 0.
                                if($pos!==1 && $fe)
                                    $row .= "<td>0</td>";
                                $fe = False;
                                //Add the data
                                $row .= "<td>".($array_2d[2])."</td>";  //change to [1] for debug
                            }
                            
                        }
                    }
                    
                    //Print the table row.
                    print("<tr><td>".$td ."</td>" . $row ."</tr>");
                    //Reset our variables.
                    $row = "";
                    $fe=True;
                    $previous_pos = 1;
                    $first_result  = True;
                }
                print("</table></br>");
                mysqli_free_result($user_perf);

            }

    }

  mysqli_free_result($customers);
}
mysqli_close($con);

?>