加入 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。
获取
userid
和fromtimeid
和tilltimeid
对应的课程
加入timetable_time
表以获取从#2 获取的fromtimeid
和tilltimeid
的值。
通过将course_timetable.courseid
与course.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 表的主要内容,如果未能解决你的问题,请参考以下文章