我有三张桌子
TABLE `courses` (
id int NOT NULL UNIQUE AUTO_INCREMENT,
title varchar(50) NOT NULL UNIQUE,
duration int NOT NULL,
theme varchar(50) NOT NULL,
students_quantity int NOT NULL,
PRIMARY KEY (id)
);
TABLE `users` (
id int NOT NULL UNIQUE AUTO_INCREMENT,
name varchar(50) NOT NULL,
email varchar(50) NOT NULL UNIQUE,
password varchar(50) NOT NULL,
status varchar(20) NOT NULL,
role_id int NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (role_id) REFERENCES `roles` (id)
);
TABLE `teachers_courses` (
teacher_id int NOT NULL,
course_id int NOT NULL,
PRIMARY KEY (teacher_id, course_id),
FOREIGN KEY (teacher_id) REFERENCES `users` (id),
FOREIGN KEY (course_id) REFERENCES `courses` (id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
我如何获得这门课程的课程。*和users.name AS teacher
,如果我course_id
我没有teacher_id
和teachers_courses
这门课程,我可以我会得到没有#39;在teacher
?
答案 0 :(得分:0)
使用JOIN
组合主键后的数据 - 外键路径。
如果第一个参数求值为coalesce()
,函数NULL
将返回第二个参数。
select c.*, coalesce(u.name, 'none') as teacher
from courses c
left join teachers_courses tc on c.id = tc.course_id
left join users u on tc.teacher_id = u.id
order by c.id
由于每门课程可以有多名教师,因此,如果没有教师分配课程(甚至不是一门课程),那么您将获得'none'
作为教师价值的唯一情况。如果有多个教师,则输出中的行数与每个课程的教师数量相同,因此我包含ORDER BY
来正确排序结果。
如果您只需要查看一门课程的数据,请包含这样的WHERE条件:
-- ... Above SQL here ...
WHERE c.id = ?