使用内部联接SQL语句时的未定义索引

时间:2018-11-09 13:05:34

标签: mysql sql join pdo

嗨,我正在尝试编写一条SQL语句来填充表,但我不断收到错误消息:

  

未定义索引:st.Name和未定义索引:s.Name。

我不明白为什么要这样做,因为我已经在SQL语句中选择了它们。我不太擅长SQL,将不胜感激。

<?php
ini_set("display_errors", 1);
try{
    $stmt = $conn->prepare(
        "SELECT st.Name, s.Name
        From Sports AS s INNER JOIN Choices AS c
        ON s.Sport_ID = c.Sport_ID INNER JOIN Student_Choices AS sc
        ON sc.T1_Choice = c.Choice_ID INNER JOIN Students AS st
        ON st.Username = sc.Username
    ");
    $stmt->execute();
    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        echo '<tr>
                <td>'.$row['st.Name'].'</td>
                <td>'.$row['s.Name'].'</td>
         </tr>
        ';
    }
}
catch(PDOException $e)
{
    echo "error".$e->getMessage();
}
?>

1 个答案:

答案 0 :(得分:4)

有多个问题。首先,您的假设是错误的,您将可以使用<table/alias-name>.<column/alias-name>访问这些列值。而是只能使用列名或定义的别名来访问它们。

现在,在这种情况下,您将拥有两个具有相同名称的列。因此,您应该为它们定义不同的别名,以避免行为不明确。我已经定义了它们student_namesport_name

定义了别名后,现在就可以仅使用别名来访问那些列值。

        $stmt = $conn->prepare(
          "SELECT st.Name AS student_name, 
                  s.Name AS sport_name 
          From Sports AS s INNER JOIN Choices AS c
          ON s.Sport_ID = c.Sport_ID INNER JOIN Student_Choices AS sc
          ON sc.T1_Choice = c.Choice_ID INNER JOIN Students AS st
          ON st.Username = sc.Username
        ");
        $stmt->execute();
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
          echo '<tr>
              <td>'.$row['student_name'].'</td>
              <td>'.$row['sport_name'].'</td>
            </tr>
          ';
        }