1

私はこの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

ここで、2013-01-28よりも大きくないWHERE clause行を選択するために別のものを追加したいと思いますが、空のフィールドも選択しますsd.student_break_date

例えば:

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

NULLこれは機能しますが、値を持つ行sd.student_break_dateはリストされません。

面倒ですよね?私の質問は次のとおりです。空のフィールドと、日付が 2013-01-28 以下のフィールドを選択するにはどうすればよいですか

4

2 に答える 2

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'

また ::

WHERE IFNULL(sd.student_break_date,'2013-01-27') <'2013-01-28'
于 2013-02-01T08:44:52.157 に答える
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 は実際には役に立ちません。

あなたの質問については、言葉遣いの悪い質問が、null または 28 日未満の sd.studen_break_date が必要であることを意味すると仮定すると、次のようになります。

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')
于 2013-02-01T09:02:38.427 に答える