在使用JOIN时无法从多个表中进行选择

时间:2012-03-23 00:20:44

标签: sql select join

以下是工作查询:

$sql_project_data = "SELECT P.project_id, P.project_name, P.project_type, 
                    F.professor_first_name, F.professor_last_name, C.course_id
                    FROM sl_student_course S
                    INNER JOIN sl_course C 
                        ON C.course_id = S.course_id
                    INNER JOIN sl_professor F 
                        ON F.professor_id = C.professor_id
                    INNER JOIN sl_project_course PC 
                        ON PC.course_id = C.course_id
                    INNER JOIN sl_project P 
                        ON P.project_id = PC.project_id
                    WHERE S.student_id = '" . $_SESSION['user_id'] . "'";

我想在where子句中添加条件“sl_project_course_student.project_id<> 33” - 但是,当我尝试执行此操作时,查询将停止工作(原始查询中曾经识别过的列不再被承认)。

$sql_project_data = "SELECT P.project_id, P.project_name, P.project_type, 
                        F.professor_first_name, F.professor_last_name, C.course_id, 
                        G.project_id
                    FROM sl_student_course S, sl_project_course_student G
                    INNER JOIN sl_course C 
                        ON C.course_id = S.course_id
                    INNER JOIN sl_professor F 
                        ON F.professor_id = C.professor_id
                    INNER JOIN sl_project_course PC 
                        ON PC.course_id = C.course_id
                    INNER JOIN sl_project P 
                        ON P.project_id = PC.project_id
                    WHERE S.student_id = '" . $_SESSION['user_id'] . "' 
                        AND G.project_id <> 33";

注意,我在“From”之后选择了第二个表,并在where子句中添加了“And”。

我假设语法错误,我应该如何更改它以使它在语法上正确?

3 个答案:

答案 0 :(得分:0)

在第二个查询中添加了一个新表:

sl_project_course_student G
<\ n>在from列表中没有将它连接到任何其他表...如果你将它加入相应的表怎么办?

答案 1 :(得分:0)

$sql_project_data = "SELECT P.project_id, P.project_name, P.project_type, F.professor_first_name, F.professor_last_name, C.course_id, G.project_id
                        FROM sl_student_course S
                            INNER JOIN sl_course C ON C.course_id = S.course_id
                            INNER JOIN sl_professor F ON F.professor_id = C.professor_id
                            INNER JOIN sl_project_course PC ON PC.course_id = C.course_id
                            INNER JOIN sl_project P ON P.project_id = PC.project_id
                            LEFT JOIN sl_project_course_student G ON P.project_id = G.project_id AND C.course_id = G.course_id AND S.student_id = G.student_id
                        WHERE S.student_id = '" . $_SESSION['user_id'] . "' AND IFNULL(G.project_id, 33) <> 33)";

答案 2 :(得分:0)

您的第二个查询缺少表JOIN的{​​{1}}语法。基于您正在尝试添加G.project_id的事实,您似乎将使用表sl_project_course_student加入

sl_project

以下是visual explanation of joins

上的有用链接

根据您说您正在寻找不在sl_project_course_student表中的那些项目的事实,您可能需要这样:

$sql_project_data = "SELECT P.project_id, P.project_name, P.project_type, 
                        F.professor_first_name, F.professor_last_name, C.course_id, 
                        G.project_id
                    FROM sl_student_course S, sl_project_course_student G
                    INNER JOIN sl_course C 
                        ON C.course_id = S.course_id
                    INNER JOIN sl_professor F 
                        ON F.professor_id = C.professor_id
                    INNER JOIN sl_project_course PC 
                        ON PC.course_id = C.course_id
                    INNER JOIN sl_project P 
                        ON P.project_id = PC.project_id
                    LEFT JOIN sl_project_course_student G
                        ON P.project_id = G.project_id
                    WHERE S.student_id = '" . $_SESSION['user_id'] . "' 
                        AND G.project_id <> 33";