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するレコードがある場合は、その行に何かを実行してからループを続行したいと考えています。私の希望する HTML 出力は次のようになります。absence

<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声明を追加することは可能ですか?代わりに、 2 つの異なるMySQLクエリとある種のforeachループが必要ですか? 私は Web プログラミングに比較的慣れていません。

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 に答える