2013-02-01 84 views
1

我有這個MySQL查詢更大:MySQL查詢選擇日期,其中字段爲空或字段日期值不大於其他日期

SELECT DISTINCT 
    * 
FROM 
    students s 
     LEFT JOIN 
    (SELECT 
     * 
    FROM 
     studentabsences a1 
    WHERE 
     (a1.absence_date = '2013-01-28')) a ON a.absence_student_id = s.student_id 
     LEFT JOIN 
    (SELECT 
     * 
    FROM 
     studentabsencenotes b1 
    WHERE 
     (b1.absence_note_date = '2013-01-28') 
    GROUP BY absence_note_student_id) b ON b.absence_note_student_id = s.student_id 
     INNER JOIN 
    studentdates sd ON sd.student_id = s.student_id 
     INNER JOIN 
    coursecategory ctc ON s.student_course_category_id = ctc.category_id 
WHERE 
    '2013-01-28' BETWEEN sd.student_startdate AND sd.student_enddate 
ORDER BY s.student_lastname , s.student_firstname 

現在我想補充的另一個WHEREclause以選擇有行不更大sd.student_break_date比2013年1月28日還要選擇空字段

例如:

WHERE '2013-01-28' >= sd.student_break_date 

這可以工作,但sd.student_break_date中沒有列出NULL值的那些行。

凌亂,是吧?我的問題是:如何選擇是空字段和字段,其中日期不高於2013年1月28日

回答

1

試試這個::

WHERE sd.student_break_date is null OR '2013-01-28' >= sd.student_break_date 

或者你可以嘗試::

WHERE sd.student_break_date is null OR sd.student_break_date<'2013-01-28' 

OR ::

WHERE IFNULL(sd.student_break_date,'2013-01-27') <'2013-01-28' 
0

BETWEEN是奇數一個用於該位的代碼

'2013-01-28' BETWEEN sd.student_startdate AND sd.student_enddate 

你實際上在做sd.student_startdate>'2013-01-28'AND sd.student_enddate <'2013-01-28'。注意在那裏沒有=所以它實際上不包括在這兩種情況下的第28。如果你想在你的條款中包含第28條,那麼BETWEEN並不是真的有用。

至於你的問題假設嚴重的措辭問題意味着你要的sd.studen_break_date要麼是零或小於28那麼它會是

WHERE sd.student_startdate>'2013-01-28' AND sd.student_enddate<'2013-01-28' AND (sd.student_break_date is null OR sd.student_break_date<='2013-01-28') 
+0

之間實際不包括的界限間隔比較。即'x與y和z'之間的轉換爲'x> = y AND x <= z' –

相關問題