2016-12-21 10 views
-3

出席、期間、ステータスの3つのテーブルがあります。私の出力を得るために、私は...誰が助けることができる各学生のすべての期間の出席を取得

SELECT * FROM status s 
LEFT JOIN (
    SELECT period_id,p_name,student_id,date,status 
    FROM period p 
    LEFT JOIN attendance a 
    ON p.period_id=a.period_id)t1 
ON s.status=t1.status 

は、しかし、それは所望の出力を与えていないこのクエリを書いた

出席:

--------------------------------------------------------- 
id | student_id | period_id |date  | Status  | 
-------------------------------------------------------- 
1 | 1   | 1   |2016-12-24 | Present 
--------------------------------------------------------| 
2 | 1   | 3   |2016-12-24 | Absent  
--------------------------------------------------------| 
3 | 2   | 1   |2016-12-24 | Late  
--------------------------------------------------------| 
4 | 2   | 2   |2016-12-24 | Present 

期間:

----------------------- 
period_id | p_name | 
----------------------- 
1   | period1 | 
----------------------- 
2   | period2 | 
----------------------- 
3   | period3 | 

ステータス:

出力

----------------------------------------------------- 
student_id | period_id | date  | Status | 
----------------------------------------------------- 
1   | 1   | 2016-12-24 | Present | 
----------------------------------------------------- 
1   | 2   | 2016-12-24 | null | 
----------------------------------------------------- 
1   | 3   | 2016-12-24 | Absent | 
----------------------------------------------------- 
2   | 1   | 2016-12-24 | Late | 
----------------------------------------------------- 
2   | 2   | 2016-12-24 | Present | 
----------------------------------------------------- 
2   | 3   | 2016-12-24 | null 
+0

あなたが望むものを得るには、LEFT JOINを使用する必要があります。 – Barmar

答えて

0

最初の表では、結果にしたいすべての行が含まれている1である必要があります。あなたのケースでは、これは、すべての異なる生徒、日付、および期間の完全な積でなければなりません。だから、クエリは次のようになります。

SELECT s.student_id, p.period_id, d.date, a.status 
FROM (SELECT DISTINCT student_id FROM attendance) AS s 
CROSS JOIN period AS p 
CROSS JOIN (SELECT DISTINCT date FROM attendance) AS d 
LEFT JOIN attendance AS a 
ON a.student_id = s.student_id AND a.period_id = p.period_id AND a.date = d.date 
ORDER BY d.date, s.student_id, p.period_id 

DEMO

あなたが重複しattendanceの表に、ステータス名を持っているので、むしろstatus_idよりも、statusテーブルの必要があるように表示されません。

+0

ありがとうございます – Jagadish

関連する問題