带有Joins和condition语句的MySql SELECT

时间:2018-06-18 16:39:26

标签: mysql join coalesce

我有三张桌子

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_idteachers_courses这门课程,我可以我会得到没有#39;在teacher

1 个答案:

答案 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 = ?