如何联接2个表并显示所有第一个表,甚至第二个表的where子句未满足?

时间:2018-07-25 06:26:53

标签: mysql

我想简单地上学/出勤,想法是老师应该每天确定学生的出勤状态。

我有2个桌子,学生和状态

这是学生桌

enter image description here

这是在线状态表

enter image description here

现在我想在我的网站上创建一个界面,该界面按班级名称和日期显示所有学生。

如果所有上课日期和当前日期的学生都没有在场状态,则显示所有在场状态为“尚未决定”的学生

如果某个班级和当前日期的学生没有在场状态,则它将为已经设置在场状态的学生显示学生在场状态A / I / S,而另一名学生的状态为“尚未决定”

这是我的查询

SELECT `a`.`student_id`, `a`.`student_name`, `b`.`presence_id`, `b`.`presence_status`, `b`.`date_presence` 
FROM `student` `a` 
left JOIN `presence` `b` ON `a`.`student_id` = `b`.`student_id` 
WHERE `a`.`class_name` = 'KLJ0009' and `b`.`date_presence` = '2018-07-24'

这是结果

enter image description here

它仅显示3个人,我想要显示的是所有学生,其class_name为KLJ0009,如果该学生没有presentation_status,则只需将present_id,presence_status和date_presence显示为空

我该怎么做?

谢谢。

2 个答案:

答案 0 :(得分:2)

您需要将以下条件移至查询的ON部分:

`b`.`date_presence` = '2018-07-24'

因此您的查询如下所示:

SELECT `a`.`student_id`, `a`.`student_name`, `b`.`presence_id`, `b`.`presence_status`, `b`.`date_presence` 
FROM `student` `a` LEFT JOIN `presence` `b` ON `a`.`student_id` = `b`.`student_id` AND `b`.`date_presence` = '2018-07-24'
WHERE `a`.`class_name` = 'KLJ0009'

注意::如果您想始终查询当前日期,可以使用NOWCURDATE而不是2018-07-24

  

演示: https://www.db-fiddle.com/f/762aXDfQConnR8XbwYQ3z4/0

答案 1 :(得分:0)

您需要当前日期,因此请使用now()函数和case when作为状态

SELECT `a`.`student_id`, `a`.`student_name`, `b`.`presence_id`,
case when `b`.`presence_status` is not null then `b`.`presence_status` else 'Yet not Decided' as  presence_status, `b`.`date_presence` FROM `student` 
`a` left JOIN `presence` `b` 
 ON `a`.`student_id` = `b`.`student_id` 
 and  `b`.`date_presence` = date(now())
 WHERE `a`.`class_name` = 'KLJ0009'