2016-01-24 99 views
0

我有这个疑问行:mysql如何显示,也不匹配where子句

SELECT `y78f2_students`.`firstname` , `y78f2_students`.`lastName` , `y78f2_students`.`student_id`,`y78f2_attendance`.`is_present`, `y78f2_attendance`.`note`, `y78f2_attendance`.`thedate` 
FROM `y78f2_students` 
INNER JOIN `y78f2_enrolls` ON `y78f2_enrolls`.`student_id` = `y78f2_students`.`student_id` 
INNER JOIN `y78f2_attendance` ON `y78f2_attendance`.`student_id` = `y78f2_students`.`student_id` 
WHERE `y78f2_enrolls`.`term` = 'Term 2 2016' 
AND `y78f2_enrolls`.`crn_class` = 'Math1R1' 
and `y78f2_attendance`.`thedate` = '2016-01-24' 
ORDER BY thedate desc 

此查询仅返回其中的日期为“2016年1月24日”的行。目前这只是一行:http://i.imgur.com/jRTBqQ0.png

我需要显示所有行,其中term ='Term 2 2016'和crn_class` ='Math1R1'以及日期尚未设置的位置。换句话说,我想向班上的所有学生展示,如果还没有为这些学生设置日期,它将显示为空。 这就是我想要的:http://i.imgur.com/jmsuSF5.png

所以总而言之,我需要显示哪些行符合条款,哪些日期将为空或不存在。 如何编写此查询?

+0

为什么被标记为[tag:sql-server]? –

+0

您可以设置日期的默认值,并通过添加“OR”来检查该值。 – aron9forever

回答

3

尝试从查询的末尾移动与连接表相关的条件,直到每个连接的表各自的ON子句。另外,如果您想要返回y78f2_attendance表中尚无行存在的记录,则该表应该是LEFT OUTER已加入,而不是INNER已加入。

SELECT `y78f2_students`.`firstname` , `y78f2_students`.`lastName`, 
    `y78f2_students`.`student_id`,`y78f2_attendance`.`is_present`, 
    `y78f2_attendance`.`note`, `y78f2_attendance`.`thedate` 
FROM `y78f2_students` 
INNER JOIN `y78f2_enrolls` ON 
    `y78f2_enrolls`.`student_id` = `y78f2_students`.`student_id` 
    AND `y78f2_enrolls`.`crn_class` = 'Math1R1' 
LEFT OUTER JOIN `y78f2_attendance` ON 
    `y78f2_attendance`.`student_id` = `y78f2_students`.`student_id` 
    AND (`y78f2_attendance`.`thedate` IS NULL OR `y78f2_attendance`.`thedate` = '2016-01-24') 
WHERE `y78f2_enrolls`.`term` = 'Term 2 2016' 
ORDER BY thedate desc 
+1

这是正确的解决方案。 – NEV

+1

谢谢@Asaph,它效果很好。正是我需要的。再次感谢! – user1179214