我有以下表结构:
`user`
id(PK)
name
`course`
id(PK)
classid(FK) --> class.id
teacherid(FK) --> user.id
starttimeid(FK) --> timetable_time.id
endtimeid(FK) --> timetable_time.id
name
`class`
id(PK)
name
`course_timetableday`
id(PK)
timetable_dayid(FK) --> timetable_day.id
`timetable_day`
id(PK)
value
`timetable_time`
id(PK)
value
我希望显示特定teacherid
的所有课程及其类名,timetable_day.value和timetable_time.value(starttimeid和endtimetimeid)。
我尝试了以下查询:
SELECT `course`.*, `class`.`name`, `timetable_day`.*, `course_timetable`.*, `timetable_time`.* FROM (`course`) JOIN `class` ON `class`.`id` = `course`.`classid` JOIN `user` ON `user`.`id` = `course`.`teacherid` JOIN `course_timetable` ON `course_timetable`.`courseid` = `course`.`id` JOIN `timetable_day` ON `timetable_day`.`id` = `course_timetable`.`timetable_dayid` JOIN `timetable_time` AS tt1 ON `tt1`.`id` = `course`.`starttimeid` JOIN `timetable_time` AS tt2 ON `tt2`.`id` = `course`.`endtimeid` WHERE `user`.`id` = 0
这给了我以下错误(虽然,表存在。我已经尝试了同一个表中的其他查询,但它们都有效):
Unknown table 'timetable_time'
答案 0 :(得分:2)
因为您将表格`timetable_time
别名为tt1
而将tt2
作为别名,所以您的select语句需要修改为使用tt1
或tt2
,像这样:
SELECT `course`.*, ... , tt1.* FROM ...
像这样:
SELECT `course`.*, `class`.`name`, `timetable_day`.*, `course_timetable`.*, tt1.*
FROM (`course`)
JOIN `class`
ON `class`.`id` = `course`.`classid`
JOIN `user`
ON `user`.`id` = `course`.`teacherid`
JOIN `course_timetable`
ON `course_timetable`.`courseid` = `course`.`id`
JOIN `timetable_day`
ON `timetable_day`.`id` = `course_timetable`.`timetable_dayid`
JOIN `timetable_time` AS tt1
ON `tt1`.`id` = `course`.`starttimeid`
JOIN `timetable_time` AS tt2
ON `tt2`.`id` = `course`.`endtimeid`
WHERE `user`.`id` = $i
注:
您不需要在刻度线中包围表格和字段名称,除非它们是保留字。因此,您的查询可以读取:SELECT course.*, ...
答案 1 :(得分:0)
您的表结构与您的查询不匹配,结构中有一个表'course_timetableday',但在您的查询中有一个名为'course_timetable'的表,显然有一个名为'courseid'的列。我假设该表名为'course_timetableday'。 这是查询,请参阅下面的评论:
SELECT course.*, class.`name` AS classname, timetable_day.value, tt1.value AS starttime, tt2.value AS endtime
FROM course
JOIN class ON class.id = course.classid
JOIN user ON user.id = course.teacherid
JOIN course_timetableday ON course_timetableday.courseid = course.id
JOIN timetable_day ON timetable_day.id = course_timetableday.timetable_dayid
JOIN timetable_time AS tt1 ON tt1.id = course.starttimeid
JOIN timetable_time AS tt2 ON tt2.id = course.endtimeid
WHERE user.id = 0;
我在class.name上添加了别名,否则它可能会覆盖course.name(取决于您的客户端程序/适配器)。 出于同样的原因,我还在tt1.value和tt2.value上添加了一个别名。如果您需要结果中连接表中的ID,则可能还需要为它们添加别名。
如果在结果集中得到重复的行,请检查course_timetableday中是否只有一个条目以及每个课程的类表。否则,您将为这些表中的每个匹配条目获得一个结果行。