在PHP函数中连接SQL中的5个表
我试图在一个集合中返回的是:在给定的开始时间和结束时间内与userID和schoolID关联的lessonid 这将显示在日历上。我只想在用户在日历上查看的时间范围内,显示与用户查看所选学校相关的课程 该数据只是显示表结构和数据类型的虚拟数据 课程表:在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
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 ";