使用PHP跨MySQL数据库的多列格式化结果

使用PHP跨MySQL数据库的多列格式化结果,php,html,mysql,Php,Html,Mysql,我正在寻找一种方法,以类似于电子表格的方式跨多个列显示MySQL数据库中的数据 我还没有开始设计桌子,因为我不确定实现我想要的最好方法 我曾考虑过以下几点: TABLE 1 - Homework Task id (INT) task (VARCHAR) 这个表格只是一个家庭作业的列表 TABLE 2 - Students id (INT) studentName (VARCHAR) 这只是一份学生名单 TABLE 3 - Homework Grades id (INT) home

我正在寻找一种方法,以类似于电子表格的方式跨多个列显示MySQL数据库中的数据

我还没有开始设计桌子,因为我不确定实现我想要的最好方法

我曾考虑过以下几点:

TABLE 1 - Homework Task

id (INT)

task (VARCHAR)
这个表格只是一个家庭作业的列表

TABLE 2 - Students

id (INT)

studentName (VARCHAR)
这只是一份学生名单

TABLE 3 - Homework Grades

id (INT)

homeworkTaskId (INT)

studentId (INT)

grade (VARCHAR)

percentage (DECIMAL)
这将保留每个学生每个家庭作业的分数

现在,我想要实现的是能够像这样显示数据:

我正在努力解决的是我对SQL命令的了解,以及是否有可能以这样一种方式检索数据,即我可以循环使用它以这种格式显示

我正在使用PHP与MySQL数据库建立PDO连接


非常感谢您在此问题上提供的任何可能的帮助。

我将使用两个查询,它更简单,如果您在家庭作业表中使用外键(student.id)查找它,那么在性能不成问题的情况下,它应该足够快

   $DB = new PDO('mysql:host='.$conf['dbhost'].';dbname='.$conf['dbname'], $conf['dbuser'], $conf['dbpass']);

   $students_stmt =  $DB->query('SELECT * FROM students');

   $homework_stmt = $DB->prepare('
       SELECT
            h.id, h.grade, h.percentage, ht.task 
       FROM
            homework AS h
       JOIN
            homework_task AS ht
       ON
          ht.id = t.homeworkTaskId
       WHERE
           h.studentId = :student_id
   ');


   $data = [];

   $max_homework = 0; //maximum number of homework records

   while( false !== ( $student = $students_stmt->fetch(PDO::FETCH_ASSOC) )){

       $homework_stmt->execute([':studentId'=>$student['id']]);

       $i = 1;
       while( false !== ( $homework = $homework_stmt->fetch(PDO::FETCH_ASSOC) )){
          $student["homework_$i"] = $homework;
          ++$i;
       }
       if( $i > $max_homework )  $max_homework = $i;

       $data[] = $student;
   }
你会得到这样一个数组

 $data = [ 0 =>   //first student
     [
        'studentName' => 'Some Guy',
        'homework_1' => [
            'grade' => 'A',
            'percentage' => '92'
        ],
        'homework_2' => [
            'grade' => 'B',
            'percentage' => '85'
        ]
        'homework_3' => [ .... ]
     ], 1 => [ ... //second student ]
  ];
然后可以循环使用
$data
并创建表

$max_家庭作业
是因为当您要显示它时,您需要知道您需要多少家庭作业列([组,百分比]),这样您可以在表中创建适当数量的标题,并填充少于该标题的学生。所以表中的每一行都有相同数量的单元格,如果这有意义的话。也就是说,如果作业记录的数量因学生而异


顺便说一句,这段代码未经测试,因为我无法了解表的完整模式。这只是一个最简单的方法(使用PDO)的示例。

这是php文档中的一个示例,应该可以帮助您入门$行将采用数据库中字段的名称,因为我们选择了result->fetchassoc

<?
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

$query = "SELECT * FROM table ORDER by ID";

if ($result = $mysqli->query($query)) {

/* fetch associative array */
while ($row = $result->fetch_assoc()) {
    echo "<div>".$row['studentname']."</div>";
    echo "<div>".$row['studentgrade']."</div>";
}

/* free result set */
$result->free();
}

/* close connection */
$mysqli->close();
?>


我不确定该尝试什么,因为我不知道如何设置循环。试试,jQgrid。-这是一个显示问题,应该不会真正影响数据的检索方式。至于提取数据,只需使用1个查询来提取学生,和其他查询来提取作业。我现在知道如何格式化HTML和获取分组,但我不知道如何循环数据来检索。检索第一列并显示每个学生的作业1结果很容易……但是,我不知道如何设置循环来显示作业2的结果,作业3等等,谢谢…它正朝着我想的方向前进。家庭作业任务表实际上也包含许多其他数据…因此需要第三个表。然后,您需要在第二个查询中加入它。添加了一个如何加入他们的示例。如果作业记录的数量是可变的,那么你必须知道作业数量最多的学生,这样你就可以用空数据填充较少的学生。当你显示它们时,它们将需要相同数量的家庭作业栏(即使它们只是空的)@Newbeginnings-我做了一些“更改”,感谢你的所有努力。我用一个类似于你的循环和一个条件。