通过内连接从不同的表中检索值

Posted

技术标签:

【中文标题】通过内连接从不同的表中检索值【英文标题】:Retrieving values from different tables via inner join 【发布时间】:2013-03-12 01:34:53 【问题描述】:

我无法使用内部联接从不同的表中检索值,输出始终不检索任何内容。此外,没有错误消息,我无法确定我的代码中出了什么问题。有人可以请帮忙?我会非常感激。这是我的代码的一部分..

<?php
    $con=mysql_connect("localhost","root","");
    mysql_select_db("student_records",$con);
    if(isset($_COOKIE['username']))
    
        if($_COOKIE['username']!='admin')
        
            $tbl6=mysql_query("SELECT A.LName, A.FName, A.MName, B.YearLevel
            FROM student as A INNER JOIN stud_course as B ON A.StudNo=B.StudNo INNER JOIN course as C ON B.CourseCode=C.CourseCode INNER JOIN religion as D ON A.ReligionID=D.ReligionID
            WHERE A.StudNo = '".mysql_real_escape_string($_COOKIE['username'])."' ");
            while($row=mysql_fetch_array($tbl6))
            
                echo "<td>".$row['LName']."</td><td>".$row['FName']."</td><td>".$row['MName']."</td><td>".$row['Course']."</td><td>".$row['YearLevel']."</td><td>".$row['EAdd']."</td><td>".$row['ReligionName']."</td></tr>";

            
        
    
    ?>

【问题讨论】:

Please, don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?改为了解prepared statements,并使用PDO 或MySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial. 另外,不要输入大写字母。这是在线版的呐喊。 @JohnConde - 你有没有把评论保存在某个地方,剪切和粘贴? @jared Farrish。是的。有一个指向 Github Gist 的链接漂浮在这里的某个地方。 试试LEFT JOIN而不是INNER JOIN 【参考方案1】:

内部联接要求联接中包含的两个表中都存在数据。在您的情况下,您有四个表,其中任何一个表都可能缺少相关数据:

SELECT A.LName, A.FName, A.MName, B.YearLevel, C.Course
FROM student as A 
INNER JOIN stud_course as B ON 
    A.StudNo=B.StudNo 
INNER JOIN course as C ON 
    B.CourseCode=C.CourseCode 
INNER JOIN religion as D ON A.ReligionID=D.ReligionID
WHERE A.StudNo = '".mysql_real_escape_string($_COOKIE['username'])."' "
如果student 表中没有StudNo 等于用户名cookie 的记录,您将得不到任何数据。 如果学生在stud_course 表中没有任何记录,您将得不到任何数据。 如果stud_course 中的CourseCode 不存在于course 表中,您将得不到任何数据。 如果学生的ReligionID 为空或具有不在religion 表中的宗教,您将不会获得任何数据。

我建议将 SQL 分成更小的部分(或者可能将每个 INNER JOIN 切换为 LEFT OUTER JOIN)以调试并发现问题所在。

注意,如果您要尝试使用它,您必须确保将 CourseEadd(不确定来自哪个表)字段添加到您的选择列表中。

【讨论】:

我还应该注意,我个人不喜欢别名表。如果我在整个 SQL 中使用表名,我觉得会更清楚。但这只是我。 非常感谢。我将尝试您的建议。 :) 有一条错误消息表明索引未定义并且它指向这一行.. echo "".$row['LName']." ".$row['FName']。" ".$row['MName']。" ".$row['Course']。" ".$row['YearLevel']." ".$row['EAdd']." ".$row['ReligionName']. ""; @scott.korin - 一个 +1 的解决方案,我希望我能再给你一个 +1 的关于混叠的评论。不只是你!别名对于许多操作(例如自联接、作为多个联接目标的表)非常重要,但我看到至少 90% 的查询不必要地使用它们。 @kdot,您的 SELECT 列表中没有 Course & EAdd。

以上是关于通过内连接从不同的表中检索值的主要内容,如果未能解决你的问题,请参考以下文章

如何从laravel中间接连接的表中检索数据?

从内部连接表中检索最新记录

SQL如何从每个连接表中检索最新结果

使用内连接 SQLITE 从两个表中删除行

我想从 2 个不同的表中进行连接查询,我想从两个表中输出

连接查询