PHP循环遍历多个数据库表

时间:2012-06-19 02:44:49

标签: mysql loops foreign-key-relationship

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

学生

+--------------+--------------------+-------------------+
| 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_idabsence.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循环吗?我对网络编程比较陌生......提前感谢,感谢很长时间。

2 个答案:

答案 0 :(得分: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。当它显示在循环中的表行中时,如果该学生的缺席表中没有任何内容,则它应显示为空列。

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

答案 1 :(得分: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>';
            }