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

Posted

技术标签:

【中文标题】使用内连接 SQL 语句时未定义的索引【英文标题】:Undefined index when using inner join SQL statement 【发布时间】:2018-11-09 13:05:33 【问题描述】:

您好,我正在尝试编写 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】:

存在多个问题。首先,您认为可以使用&lt;table/alias-name&gt;.&lt;column/alias-name&gt; 访问这些列值的假设是错误的。相反,它们只能使用列名或定义的别名来访问。

现在,在这种情况下,您有两个具有相同名称的列。因此,您应该为它们定义不同的别名,以避免模棱两可的行为。我已经定义了它们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>
          ';
        

【讨论】:

或者更好地命名它们为studentsport ;) 谢谢它的工作,然后我又得到了两个运动 T2_Choice 和 T3_Choice。一个人将如何实现这些,因为它们也将作为 s_name 返回 @TobyDixonSmith btw ,您可以为另外两项运动设置不同的别名;他们没有相同别名的限制

以上是关于使用内连接 SQL 语句时未定义的索引的主要内容,如果未能解决你的问题,请参考以下文章

比较内连接和外连接 SQL 语句

Mysql语句及优化

SQl 语句 表的连接

选择连接SQL语句中的内连接和where之间的区别[重复]

选择语句上的 SQL 内连接

内连接嵌套在更新语句 SQL 中