1

私はMySQLこのような2つのテーブルを持っています:

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

生徒がテーブルに2つ以上の行を持っている場合、その生徒はstudentabsence2回リストされます。

私の質問は、クエリをより具体的にする方法があるかどうかです。からのすべての学生をリストしたいと思いdb.students ますdb.studentabsence。開始日と終了日の間の日付(たとえば、2012-07-30)の行がある場合は、この欠席情報を使用して学生を1回リストします。日付に一致する場合のみ。

だから...

... 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 ...

説明するのはちょっと難しいので、もっと情報が必要な場合は教えてください...

4

2 に答える 2

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
于 2012-07-30T14:44:07.467 に答える
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' )  
于 2012-07-30T14:49:17.870 に答える