我正在进行查询,但无法正常使用。
我的表格详情如下:
分区:
ID
菲尔兹研究领域
student_subarea:
id主键,
student_id,
student_subarea subarea id和student_subarea的外键。
ASK:
我想要完成的是在一栏中获得所有学习领域,在另一栏中获得学生的ID,如果他在课堂上的话。否则,显示null或其他内容。
SELECT a.`id` , a.`name` , a.`area_id` , u. *
FROM `subarea` a
LEFT JOIN student_subarea u ON u.subarea_id = a.id
WHERE u.student_id =50
OR u.student_id IS NULL
这样做根本没有帮助。我试图使用函数和子查询没有任何成功。有人可以帮助我。
答案 0 :(得分:2)
left join
和过滤的一般规则是将on
子句中的过滤子句放在除第一个表之外的所有子句中。所以这可能会做你想要的:
SELECT a.`id`, a.`name`, a.`area_id`, u. *
FROM `subarea` a LEFT JOIN
student_subarea u
ON u.subarea_id = a.id AND u.student_id = 50;
你怎么记得这个逻辑?即使第二个表上没有匹配项,left join
也会返回第一个表中的所有行。这似乎是你想要的。
您的逻辑问题是除学生50
以外的学生符合逻辑。因此,这些行被过滤掉了。
答案 1 :(得分:0)
将过滤条件移至JOIN
SELECT a.`id` , a.`name` , a.`area_id` , u. *
FROM `subarea` a
LEFT JOIN student_subarea u
ON u.subarea_id = a.id
AND u.student_id =50
答案 2 :(得分:0)
您应该将条件放在加入条件中的学生ID中,而不是where
子句中:
SELECT a.id, a.name , a.area_id, u.*
FROM subarea a
LEFT JOIN student_subarea u
ON u.subarea_id = a.id
AND u.student_id = 50