在MySQL中连接多个表

时间:2013-12-21 18:04:04

标签: php mysql sql foreign-keys foreign-key-relationship

我有以下表结构:

`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'

2 个答案:

答案 0 :(得分:2)

因为您将表格`timetable_time别名为tt1而将tt2作为别名,所以您的select语句需要修改为使用tt1tt2,像这样:

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中是否只有一个条目以及每个课程的类表。否则,您将为这些表中的每个匹配条目获得一个结果行。