在PHP函数中连接SQL中的5个表

在PHP函数中连接SQL中的5个表,php,mysql,sql,join,Php,Mysql,Sql,Join,我试图在一个集合中返回的是:在给定的开始时间和结束时间内与userID和schoolID关联的lessonid 这将显示在日历上。我只想在用户在日历上查看的时间范围内,显示与用户查看所选学校相关的课程 该数据只是显示表结构和数据类型的虚拟数据 课程表: lessonID roomFK startTime endTime 1 2 2014-08-01 13:00:00 2014-08-01 14:00:00 2

我试图在一个集合中返回的是:在给定的开始时间和结束时间内与userID和schoolID关联的lessonid

这将显示在日历上。我只想在用户在日历上查看的时间范围内,显示与用户查看所选学校相关的课程

该数据只是显示表结构和数据类型的虚拟数据

课程表:

lessonID  roomFK    startTime                 endTime
   1        2      2014-08-01 13:00:00   2014-08-01 14:00:00 
   2        3      2014-08-01 13:00:00   2014-08-01 14:00:00 
房间桌子:

roomID   schoolFK
1            1
2            1
3            2
4            2
学校桌子:

schoolID 
   1
   2
用户表:

userID
  1
  2
  3
课程/教师连接表:

lessonFK    teacherFK
    1          1
    1          2
    2          3
我所尝试的:

function find_lessons_by_school_id_and_teacher_id_ranged_feed($school_id, $teacher_id, $start, $end) {
    global $connection;

    $school_id = mysqli_real_escape_string($connection, $school_id);
    $teacher_id = mysqli_real_escape_string($connection, $teacher_id);
    $start = mysqli_real_escape_string($connection, $start);
    $end = mysqli_real_escape_string($connection, $end);

    $start = strftime("%Y-%m-%d %H:%M:%S", $start);
    $end = strftime("%Y-%m-%d %H:%M:%S", $end);

    $query = "SELECT * ";
    $query .= "FROM lesson ";
    $query .= "JOIN room ON lesson.roomFK = room.roomID ";
    $query .= "JOIN school ON room.schoolFK = school.schoolID ";
    $query .= "JOIN user ON user.userID = junc_lesson_teacher.teacherFK ";
    $query .= "JOIN junc_lesson_teacher ON junc_lesson_teacher.lessonFK = lesson.lessonID ";
    $query .= "WHERE room.schoolFK = '{$school_id}' ";
    $query .= "AND lesson.startTime >= '{$start}' ";
    $query .= "AND lesson.endTime <= '{$end}' ";
    $query .= "AND user.userID = '{$teacher_id}' ";
    $query .= "ORDER BY lesson.roomFK ASC";

    $set = mysqli_query($connection, $query);


    return $set;

}
当我运行这个时,mySQL会抱怨查询语句

如果您对如何正确执行此操作有任何意见,我们将不胜感激!谢谢

而不是

$query = "SELECT * ";
写入所有表中的所有必填字段

$query = "SELECT lesson.roomFK,room.roomID,school.schoolID,room.schoolFK,user.userID,junc_lesson_teacher.teacherFK,junc_lesson_teacher.lessonFK,lesson.lessonID";

如果您有一个适度合理的命名策略,该查询可能如下所示

$query = "
SELECT columns
     , i
     , actually
     , want
  FROM lesson l
  JOIN room r
    ON r.room_id = l.room_id 
  JOIN school s
    ON s.school_id = r.school_id
  JOIN lesson_teacher lt           -- <-- NOTE TABLES SWAPPED AROUND
    ON lt.lesson_id = l.lesson_id    
  JOIN user u
    ON u.user_id = lt.teacher_id  -- <-- SEE?
 WHERE r.school_id  = $school_id   
   AND l.startTime >= '$start' 
   AND l.endTime   <= '$end' 
   AND u.user_id    = $teacher_id 
 ORDER 
    BY l.room_id ASC;
";

$set = mysqli_query($connection, $query)
  or die(mysqli_error($connection)); -- for development only

联接操作的顺序错误。你必须交换最后两个。而不是

$query .= "FROM lesson ";
$query .= "JOIN room ON lesson.roomFK = room.roomID ";
$query .= "JOIN school ON room.schoolFK = school.schoolID ";
$query .= "JOIN user ON user.userID = junc_lesson_teacher.teacherFK ";
$query .= "JOIN junc_lesson_teacher ON junc_lesson_teacher.lessonFK = lesson.lessonID ";


因为必须首先介绍联接中使用的每个表。根据您的声明,您不能使用junc_lesson_教师加入用户表,因此您必须在加入用户之前加入junc_lesson_教师。将表视为一个没有中断的链。

错误消息是什么?它不会返回结果集。查询无效。子句中的未知列“junc_lesson_teacher.teacherFK”在将b连接到a之前,不能将c连接到b。可能会出现错误消息。从您提供的表列表中,您没有junc_lesson_教师,但您有junc_lesson_用户。如果这是正确的表,则必须在适当的情况下更改字段名。所有表上都有更多字段,如用户名、组、电子邮件等,我也需要这些字段。我不认为这是问题所在,伙计。这是一个评论,不是一个答案-但Neo博士想使用答案窗口格式选项。尽管如此,我无法忍受所有这些$query。你说得对。使用带有参数的预处理语句将输入值绑定到,也将增强此查询。我认为所有这些问题都只缺少一个空格…+1,以解决主要问题并避免容易出错的字符串连接
$query .= "FROM lesson ";
$query .= "JOIN room ON lesson.roomFK = room.roomID ";
$query .= "JOIN school ON room.schoolFK = school.schoolID ";
$query .= "JOIN junc_lesson_teacher ON junc_lesson_teacher.lessonFK = lesson.lessonID ";
$query .= "JOIN user ON user.userID = junc_lesson_teacher.teacherFK ";