1

假设我有一个如下的数据库结构:

学生

+--------------+--------------------+-------------------+
| student_id   | student_firstname  | student_lastname  |
+--------------+--------------------+-------------------+
| 1            | John               | Doe               |
+--------------+--------------------+-------------------+
| 2            | Lisa               | Doe               |
+--------------+--------------------+-------------------+
| 3            | Derp               | Doe               |
+--------------+--------------------+-------------------+

缺席

+--------------+--------------------+-------------------+---------------+
| absence_id   | absence_student_id | absence_date      | absence_note  |
+--------------+--------------------+-------------------+---------------+
| 1            | 2                  | 2012-06-10        | A note...     |
+--------------+--------------------+-------------------+---------------+
| 2            | 3                  | 2012-06-30        | Another note. |  
+--------------+--------------------+-------------------+---------------+

students.student_id以及列和之间的关系absence.absence_student_id

在 PHP 中,我想遍历上面的表并获得行的完整输出,students如果有absence匹配该学生的记录,则对该行执行某些操作,然后继续循环。

我想要的 HTML 输出是这样的:

<table>
 <thead>
  <tr>
    <td>Name:</td>
    <td>Absence date:</td>
    <td>Absence note:</td>
  </tr>
 </thead>

 <tr>
    <td>John Doe</td>
    <td></td>
    <td></td>
 </tr>

 <tr>
    <td>Lisa Doe</td>
    <td>2012-06-10</td>
    <td>A note...</td>
 </tr>

 <tr>
    <td>Derp Doe</td>
    <td>2012-06-30</td>
    <td>Another note.</td>
 </tr>
</table>

我用这样的循环:

<?php
  while ($row = mysql_fetch_array($students_sql_query)) {
   echo "<tr><td>".$row['student_firstname']."</td></tr>";
 }
?>

是否可以为此添加某种if声明?我需要两个不同MySQL的查询和某种foreach循环吗?我对网络编程比较陌生...在此先感谢并抱歉发了很长的帖子。

4

2 回答 2

3

您需要在查询中加入表,然后从查询中获取结果。

SELECT Students.student_firstname
   , Students.student_lastname 
   , Absence.absence_date 
   , Absence.absence_note  
FROM Students
LEFT JOIN Absence ON Students.id = Absence.absence_student_id

然后,您应该能够像这样循环遍历它:

<?php
    while ($row = mysql_fetch_array($students_sql_query)) 
    {
?>
        <tr>
            <td>$row['student_firstname']</td>
            <td>$row['student_lastname']</td>
            <td>$row['absence_date']</td>
            <td>$row['absence_note']</td>
        </tr> 
<?
    }
?>

左连接将告诉数据库拉入所有学生,如果他们缺席,它也会填充这些学生。如果学生没有缺勤,那将从数据库中返回为 null。当它显示在循环中的表行中时,如果该学生的缺勤表中没有任何内容,它应该显示为空列。

唯一的缺点是如果学生有多次缺勤,它将在显示表中重复行。在这种情况下,您必须在代码或显示中进行一些预处理来处理这种情况。

于 2012-06-19T02:56:24.000 回答
0

使用 pdo 如下:

 $sql = $dbh->prepare('
        SELECT student_firstname, student_lastname, absense_date, absense_note 
        FROM students s inner join absense a 
        ON s.student_id=a.absense_student_id
        ');
        $sql->execute();
        $result = $sql->fetchAll(); <----- fetch All the data
        return $result;

     foreach($result as $row)
            {
            echo '<tr>';
            echo '<td>'.$row['student_firstname'].' '.$row['student_lastname'].'</td>';
            echo '<td>'.$row['absense_date'].'</td>';
            echo '<td>'.$row['absense_note'].'</td>';
            echo '</tr>';
            }
于 2012-06-19T03:01:08.633 回答