【问题标题】:MySQL query to match date and null between two tablesMySQL查询以匹配两个表之间的日期和空值
【发布时间】:2012-07-28 05:39:27
【问题描述】:

我有两个这样的MySQL-tables:

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 中有一行 date 在 startdate 和 enddate 之间(例如 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 ...

这有点难以解释,所以如果您需要更多信息,请告诉我......

【问题讨论】:

    标签: mysql date join


    【解决方案1】:

    我认为您可以在子选择/子视图上使用 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
    

    【讨论】:

    • 完美。非常感谢。
    【解决方案2】:

    我会使用具有默认值的参数 (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' )  
    

    【讨论】:

    • 感谢您的回复,不过我还是接受了@aleroot 的建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    相关资源
    最近更新 更多