2012-07-30 106 views
1

之间匹配的日期和空我有两个MySQL -tables这样的:MySQL查询两个表

desc students; 
+---------------------------+---------------+------+-----+---------+ 
| Field      | Type   | Null | Key | Default | 
+---------------------------+---------------+------+-----+---------+ 
| student_id    | int(11)  | NO | PRI | NULL | 
| student_firstname   | varchar(255) | NO |  | NULL | 
| student_lasttname   | varchar(255) | NO |  | NULL | 
+---------------------------+---------------+------+-----+---------+ 

desc studentabsence; 
+---------------------------+-------------+------+-----+---------+ 
| Field      | Type  | Null | Key | Default | 
+---------------------------+-------------+------+-----+---------+ 
| student_absence_id  | int(11)  | NO | PRI | NULL | 
| student_id    | int(11)  | YES |  | NULL | 
| student_absence_startdate | date  | YES |  | NULL | 
| student_absence_enddate | date  | YES |  | NULL | 
| student_absence_type  | varchar(45) | YES |  | NULL | 
+---------------------------+-------------+------+-----+---------+ 

然后,我有这个MySQL - 查询列出的学生。

查询:

SELECT s.student_id, s.student_firstname, s.student_lastname, 
a.student_absence_startdate, a.student_absence_enddate, a.student_absence_type 
FROM students s LEFT JOIN studentabsence a ON a.student_id = s.student_id 

每当学生有这显示在列

a.student_absence_startdate
a.student_absence_enddate
a.student_absence_type

有时缺乏信息的学生在表中studentabsence两个或两个以上的行然后他被列出两次。

我的问题是否在查询中有更具体的方法。我想列出db.students中的所有学生,如果在db.studentabsence中有一行日期在开始日期和结束日期之间(例如2012-07-30),则列出学生一次该缺席信息。只有当日期有匹配时。

所以像...

... WHERE (a.student_absence_startdate OR a.student_absence_enddate) IS NULL OR 
    '2012-07-30' BETWEEN a.student_absence_startdate AND 
    a.student_absence_enddate ... 

这是有点难以解释,所以让我知道如果你需要更多信息...

回答

2

我认为,你可以在一个JOIN安排吧再选择/子视图:

SELECT s.student_id, s.student_firstname, s.student_lastname, 
a.student_absence_startdate, a.student_absence_enddate, a.student_absence_type 
FROM students s 
LEFT JOIN 
(SELECT * FROM studentabsence a1 WHERE ('2012-07-30' BETWEEN a1.student_absence_startdate AND a1.student_absence_enddate)) a 
ON a.student_id = s.student_id 
+0

完美。非常感谢你。 – David 2012-07-30 14:57:54

1

我会使用默认值(01/01/1900 00:00:00),像这样的参数:

AND (a.student_absence_startdate >= @P_startdate OR @P_startdate = '01/01/1900 00:00:00') 
AND (a.student_absence_enddate <= @P_enddate OR @P_enddate = '01/01/1900 00:00:00') 
+0

谢谢你的回复,但是我用@aleroot建议去了! – David 2012-07-30 14:58:13