【问题标题】:while loop in mysql inner joinmysql内部连接中的while循环
【发布时间】:2018-07-12 12:02:03
【问题描述】:

我的代码使用 INNER JOIN 加入 4 个表。使用内部联接时无法自定义循环。如何控制 while 子句,使不需要的循环不会发生。

我的代码输出(学生和学校名称在每个学科领域循环)

我想像这样显示学生和学校同时循环。

我的 PHP 代码

<table id="customers">
    <?php
        $query=$con->prepare("SELECT subjectcomb.subjectid, subjectcomb.schoolid, student.student, school.school, subject.name 
        FROM ((( subjectcomb
        INNER JOIN school ON subjectcomb.schoolid=school.id)
        INNER JOIN student ON subjectcomb.schoolid=student.schoolID)
        INNER JOIN subject ON subjectcomb.subjectid=subject.id)");
        $query->execute();
        while ($row = $query->fetch(PDO::FETCH_ASSOC)){?>
            <tr>
                <td>
                    <?php echo $row['school']."->".$row['student']?>
                </td>
            </tr>
            <tr>
                <td>
                    <?php echo $row['name']?>
                    <input type="text" name="mark"></input>
                </td>           
            </tr>
        <?php } ?>
</table>

【问题讨论】:

  • 在第一个&lt;tr&gt;之前添加一个if判断,判断是否已经输出了这个schoool-&gt;student可以解决这个问题。但我猜你想用 SQL 命令解决它?
  • 您是否尝试在查询中使用group by student.student, school.school
  • @Phil 在这种情况下如何应用 if 子句,请举例说明。
  • @AnandaLC,Lucas Borges 刚刚给你举了一个例子。这也是我的意思。

标签: php mysql loops join


【解决方案1】:

尝试在您的查询中添加ORDER BY

$query=$con->prepare("SELECT subjectcomb.subjectid, subjectcomb.schoolid, student.student, school.school, subject.name 
        FROM ((( subjectcomb
        INNER JOIN school ON subjectcomb.schoolid=school.id)
        INNER JOIN student ON subjectcomb.schoolid=student.schoolID)
        INNER JOIN subject ON subjectcomb.subjectid=subject.id)
        ORDER BY school.school, student.student");

然后在while 循环中使用这个检查:

<?php
$last_student = ""
while ($row = $query->fetch(PDO::FETCH_ASSOC)){
    if ($last_student != $row['student']) {
?>
    <tr>
        <td>
            <?php echo $row['school']."->".$row['student']?>
        </td>
    </tr>
    <?php } ?>
    <tr>
        <td>
            <?php echo $row['name']?>
            <input type="text" name="mark"></input>
        </td>           
    </tr>
<?php $last_student = $row['student'] } ?>

【讨论】:

    【解决方案2】:

    我认为菲尔的意思类似于以下内容。您跟踪以前的学校和学生。如果当前学校和学生与以前相同,则跳过打印学校/学生行,但如果它们不同,则打印它们并更新以前学校和以前学生的值。

    $prev_school = '';
    $prev_student = '';
    while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
      if ($row['school'] != $prev_school && $row['student'] != $prev_student) { ?>
        <tr>
          <td>
            <?php echo $row['school']."->".$row['student'] ?>
          </td>
        </tr>
        <?php
        $prev_school = $row['school'];
        $prev_student = $row['student'];
      }
      ?>
      <tr>
        <td>
          <?php echo $row['name']?>
          <input type="text" name="mark"></input>
        </td>           
      </tr>
      <?php 
    }
    

    【讨论】:

    • 感谢您的精彩回答
    猜你喜欢
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2021-06-29
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多