2016-05-06 8 views
0

ここに私のクエリです。私は定義されたテーブルとテーブルを結合しようとしています。しかし、問題は、私たちが左に参加しようとしている時です。例えばMysql自己定義テーブルで問題を登録

SELECT A.*,B.*, 
(CASE WHEN A.preday != '' THEN 'A' ELSE 'P' END) AS PreStat 
FROM (
    SELECT '2016-05-04' AS preday 
    UNION 
    SELECT '2016-05-03' 
    UNION 
    SELECT '2016-05-02' 
) AS A 
LEFT JOIN `student_attendence` AS B ON B.date = A.preday 
WHERE student_id='1' ; 

私の右の表の値が「2016年5月2日」で日付フィールドが含まれていない、しかし、我々は左しようとしているとき、それはないでしょう..butそれがNULL値で来るべきで参加来る。

私の右には、テーブル構造は、私はそれを解決するために助けてください enter image description here

で参加します。

+0

ここで「自己定義」とは何ですか?また、可能であれば、画像の代わりに 'SHOW CREATE TABLE'の** text **を投稿してください。 – tadman

+0

は 'どこstudent_ID = '1''を' student_ID =' 1''に変更するので、それは場所の代わりに結合の一部です。この方法では、結合の前に制限が適用され、結合によって作成されたNULLレコードが残ります。 – xQbert

+0

@tadmanは、左のテーブルデータが状況に応じて動的に定義されていることを意味します。 –

答えて

1

これについて少し考えてみましょう。 Student_IDはstudent_Attendenceテーブル上にのみ存在します(これらの2つのテーブルのために)。生徒はその日の記録を持たないかもしれません(結果に02を得られない場合、少なくとも生徒1の場合)。派生したユニオンテーブルからすべての日を望む場合、参加するので、学生の1レコードの比類のない日は、左から保存されて発生したが、STUDENT_ID 1 Student_Attendanceは次のようになり

SELECT A.*,B.*, (CASE WHEN A.preday != '' THEN 'A' ELSE 'P' END) AS PreStat 
FROM (SELECT '2016-05-04' AS preday 
     UNION SELECT '2016-05-03' 
     UNION SELECT '2016-05-02') AS A 
LEFT JOIN `student_attendence` AS B 
    ON B.date = A.preday 
    and student_id='1' ; 

に参加する前に、あなたはそう

ID Date 
1 2016-05-05 
1 2016-05-04 
1 2016-05-03 
1 2016-05-01 

... students_IDをフィルタリングするために、左を必要とします...で

Preday   ID Date     
2016-05-04   1 2016-05-04 
2016-05-03   1 2016-05-03 
2016-05-02   

をもたらすであろう参加して、2016年5月2日以来、where句を...適用する際に学生1のエントリを持っていない、それが解消されます。..

Preday   ID Date     
2016-05-04   1 2016-05-04 
2016-05-03   1 2016-05-03 

ただし、where句をジョインに移動すると、フィルタはジョインの前に適用され、したがって02の日付は保持されます。

Preday   ID Date     
2016-05-04   1 2016-05-04 
2016-05-03   1 2016-05-03 
2016-05-02   
+0

Thanx @xQbert ..それは正常に動作します。 –

+0

外部結合を使用するときはいつでも。 WHERE句の制限は、すべてのレコードが返されるテーブルでのみ可能です。すべてのレコードを保存する場合は、見たようにINNER結合結果が得られます。 – xQbert

0

ために実行される最初の句としてクエリの論理的なクエリ処理の理由は、あなたがあなた自身を実行

によって場所>グループ>た> select>のため、その後句からです実行される最初の句を照会すると、左端が の結合で期待通りに '2016-05-02'が返されますが、それ以降のwhere句は結果セットをフィルタリングして、nullが不明であるため削除します(isn '値は、値が足りないことを意味します)

あなたはwhere clとオペレーターとの使用。

関連する問題