加入 4 个 MySQL 表

Posted

技术标签:

【中文标题】加入 4 个 MySQL 表【英文标题】:Joining 4 MySQL tables 【发布时间】:2013-12-15 08:50:17 【问题描述】:

我有以下表格:

`course`:
`id` (PK)
`userid` (FK)
`fromtimeid` (FK) --> `timetable_time`
`tilltimeid` (FK) --> `timetable_time`

`course_timetable`:
`id` (PK)
`courseid` (FK) --> `course`
`timetable_dayid` (FK) --> `timetable_day`

`timetable_time`:
`id` (PK)
`value`

`timetable_day`:
`id` (PK)
`value`

我想提供$userid 并想获取包含该用户时间表的数组。

我正在努力工作的想法是:

    获取用户 ID。 获取useridfromtimeidtilltimeid对应的课程 加入timetable_time 表以获取从#2 获取的fromtimeidtilltimeid 的值。 通过将course_timetable.courseidcourse.id 连接起来,从course_timetable 表中获取日期(从#3 获取) 加入timetable_day 并获取天数。

我已尝试执行以下操作,但会引发错误:

SELECT `course`.*, `course_timetable`.*
FROM (`course`)
JOIN `course_timetable` ON `course_timetable`.`courseid` = `course`.`id`
JOIN `timetable_day` ON `timetable_day`.`id` = `course_timetable`.`timetable_dayid`
JOIN `timetable_time` ON `timetable_time`.`id` = `course`.`fromtimeid`
JOIN `timetable_time` ON `tiemtable_time`.`id` = `course`.`tilltimeid` 
WHERE `userid` = $id

显示的错误是:

Error Number: 1066

Not unique table/alias: 'timetable_time'

SELECT `course`.*, `course_timetable`.* FROM (`course`) JOIN `course_timetable` ON `course_timetable`.`courseid` = `course`.`id` JOIN `timetable_day` ON `timetable_day`.`id` = `course_timetable`.`timetable_dayid` JOIN `timetable_time` ON `timetable_time`.`id` = `course`.`fromtimeid` JOIN `timetable_time` ON `timetable_time`.`id` = `course`.`tilltimeid` WHERE `teacherid` = 0

我哪里错了?

【问题讨论】:

您也有问题要问我们吗? (EG。你的问题是什么?) @nl-x:mysql 查询不工作。 :( 怎么不工作了?你有错误吗?如果是这样,错误是什么?你的输出是什么,你的预期输出是什么? timetable_time 的至少一个引用提供一个别名,例如JOIN timetable_time AS t1 一个好的经验法则是,当您发现自己说“它不起作用”时,将其从问题中删除,并将其替换为您所期望的以及您实际收到的内容。为了。每一个。单身的。问题。 +1 【参考方案1】:

由于您多次加入同一个表,您需要为它们提供别名以消除歧义:

JOIN `timetable_time` t1 ON t1.`id` = `course`.`fromtimeid`
JOIN `timetable_time` t2 ON t2.`id` = `course`.`tilltimeid`

【讨论】:

【参考方案2】:

您将加入timetable_time 两次。

首先我想知道这是否有必要。但如果是这样,您至少需要给其中一个别名:

JOIN SomeTimable AS SomeTableAlias ON ...

在引用该特定表时,您还需要使用别名。所以在 SELECT 和 ON 子句中使用别名。

(顺便说一句。在给表格起别名时,您可以省略关键字 AS。)

【讨论】:

【参考方案3】:

您的问题是您两次加入表timetable_time 并使用相同的名称。将其更改为:

SELECT `course`.*, `course_timetable`.*
FROM (`course`)
JOIN `course_timetable` ON `course_timetable`.`courseid` = `course`.`id`
JOIN `timetable_day` ON `timetable_day`.`id` = `course_timetable`.`timetable_dayid`
JOIN `timetable_time` t1 ON t1.`id` = `course`.`fromtimeid`
JOIN `timetable_time` t2 ON t2.`id` = `course`.`tilltimeid` WHERE `userid` = $id

【讨论】:

【参考方案4】:

在连接中为您的 timetable_time 表分配别名,如下所示:

SELECT `course`.*, `course_timetable`.*
FROM (`course`)
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`.`fromtimeid`
JOIN `timetable_time` AS `tt2` ON `tt2`.`id` = `course`.`tilltimeid` 
WHERE `userid` = $id

【讨论】:

以上是关于加入 4 个 MySQL 表的主要内容,如果未能解决你的问题,请参考以下文章

慢查询分组,加入MYSQL laravel

mysql 7 +加入一个表,如何加快速度?

使用 MySQL 表加入 LibreOffice 基表的建议

使用 Apache Drill 进行多表连接

我如何查询给定日期范围的mysql并加入两个表?

MySQL - 加入 2 个表