MySQL:交替左连接三个表
MySQL: alternate to left join over three tables
我有三个 table 具有以下结构。
Table child
ID , Name, ....
3, John, ...
5, erik,....
7, Maya
child id 与第二个 table 中的老师有关。
Table teacher_child_relation
id, child_id, teacher_id
1, 3(john), 4(roberts)
2, 5(erik), 9(maria)
老师的详细信息在第三个table。
Table teacher
id, Name,....
4, Roberts
9, Maria
现在我运行下面的查询来获取分配给child的老师的姓名。我正在使用以下查询。
SELECT c.*, t.name,
FROM child c, teacher_child_relation ct, teacher t
WHERE c.id = ct.child_id AND ct.teacher_id = t.id
这个returns我只有child任老师的那些记录。我想要一个 returns child 的所有记录的查询,并显示一个未分配教师的空字段。
首先:对于一个 child 的所有老师,你会得到几行,我不确定你是否知道这一点。
其次:如何反对漂亮的左连接?
select c.*, t.name
from child c
left join teacher_child_relation ct on ct.child_id = c.id
left join teacher t on t.id = ct.teacher_id
您也可以尝试只列出每个 child 一次,并获得此 child 的所有教师的串联列表。这取决于你需要什么。
SELECT child.ID, child.Name, teacher.Name
FROM child
LEFT JOIN teacher_child_relation ON child.Id = teacher_child_relation.child_id
LEFT JOIN teacher ON teacher.id = teacher_child_relation.teacher_id;
1) 这会给出所有 children 的信息,无论教师是否分配给 child,
SELECT c.`id` AS `child_od`,c.`Name` AS `child_name`,t.`Name` AS `teacher_name`
FROM child c
LEFT JOIN teacher_child_relation tc ON c.`id`=tc.`child_id`
LEFT JOIN teacher t ON tc.`teacher_id`=t.`id`;
2) 这仅提供分配给教师的 child 的信息,
SELECT c.`id` AS `child_id`,c.`Name` AS `child_name`,t.`Name` AS `teacher_name`
FROM child c
JOIN teacher_child_relation tc ON c.`id`=tc.`child_id`
JOIN teacher t ON tc.`teacher_id`=t.`id`;
我建议您只需点击几下即可使用 SQLyog wherein you can generate the above query,它还提供了连接表的选项,因此无需记住 sql 语句的语法。
我有三个 table 具有以下结构。
Table child
ID , Name, ....
3, John, ...
5, erik,....
7, Maya
child id 与第二个 table 中的老师有关。
Table teacher_child_relation
id, child_id, teacher_id
1, 3(john), 4(roberts)
2, 5(erik), 9(maria)
老师的详细信息在第三个table。
Table teacher
id, Name,....
4, Roberts
9, Maria
现在我运行下面的查询来获取分配给child的老师的姓名。我正在使用以下查询。
SELECT c.*, t.name,
FROM child c, teacher_child_relation ct, teacher t
WHERE c.id = ct.child_id AND ct.teacher_id = t.id
这个returns我只有child任老师的那些记录。我想要一个 returns child 的所有记录的查询,并显示一个未分配教师的空字段。
首先:对于一个 child 的所有老师,你会得到几行,我不确定你是否知道这一点。
其次:如何反对漂亮的左连接?
select c.*, t.name
from child c
left join teacher_child_relation ct on ct.child_id = c.id
left join teacher t on t.id = ct.teacher_id
您也可以尝试只列出每个 child 一次,并获得此 child 的所有教师的串联列表。这取决于你需要什么。
SELECT child.ID, child.Name, teacher.Name
FROM child
LEFT JOIN teacher_child_relation ON child.Id = teacher_child_relation.child_id
LEFT JOIN teacher ON teacher.id = teacher_child_relation.teacher_id;
1) 这会给出所有 children 的信息,无论教师是否分配给 child,
SELECT c.`id` AS `child_od`,c.`Name` AS `child_name`,t.`Name` AS `teacher_name`
FROM child c
LEFT JOIN teacher_child_relation tc ON c.`id`=tc.`child_id`
LEFT JOIN teacher t ON tc.`teacher_id`=t.`id`;
2) 这仅提供分配给教师的 child 的信息,
SELECT c.`id` AS `child_id`,c.`Name` AS `child_name`,t.`Name` AS `teacher_name`
FROM child c
JOIN teacher_child_relation tc ON c.`id`=tc.`child_id`
JOIN teacher t ON tc.`teacher_id`=t.`id`;
我建议您只需点击几下即可使用 SQLyog wherein you can generate the above query,它还提供了连接表的选项,因此无需记住 sql 语句的语法。