首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL中连接多个表

在MySQL中连接多个表
EN

Stack Overflow用户
提问于 2013-12-21 18:04:04
回答 2查看 94关注 0票数 1

我的表结构如下:

代码语言:javascript
复制
`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)。

我尝试了以下查询:

代码语言:javascript
复制
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

这给我带来了以下错误(尽管如此,该表还是存在的。我尝试过来自同一个表的其他查询,它们都能工作):

代码语言:javascript
复制
Unknown table 'timetable_time'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-21 18:07:40

由于您已经将表`timetable_time别名为tt1,再次将其命名为tt2,所以需要修改select语句以使用tt1tt2,如下所示:

代码语言:javascript
复制
SELECT `course`.*, ... , tt1.* FROM ...

就像这样:

代码语言:javascript
复制
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.*, ...

票数 2
EN

Stack Overflow用户

发布于 2013-12-23 11:45:02

您的表结构与您的查询不匹配,结构中有一个表'course_timetableday‘,但是在您的查询中有一个名为'courseid’的表,它显然有一个名为‘courseid’的列。我以为这张表名为“”。以下是查询,请参阅下面的备注:

代码语言:javascript
复制
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表和类表中是否确实只有一个条目。否则,您将为这些表中的每个匹配项获得一个结果行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20721962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档