0

このようなmysqlクエリがあります

SELECT s.admission_number, s.student_name, c.class, m.month, 
       f.fee, fr23.amount_received
FROM students s
LEFT JOIN fee_receipts fr ON s.id = fr.admission_number
LEFT JOIN fee_receipts_23_repeat fr23 ON fr.id = fr23.parent_id
JOIN class c ON s.class = c.id
LEFT JOIN fee f ON f.id = fr23.fee
LEFT JOIN months m ON m.id = fr23.month

このような結果を示すのはどれですか?

ad_num  student_name class   month    fee   amount_received 
779     A Jain      Nur     January Tuition   Fee   575.00
808     A Gupta     Nur     January Tuition   Fee   0.00
821     A Mohanty   Nur     NULL    NULL            NULL
818     ATiwari     Nur     FebruaryTuition   Fee   575.00
826     D Mishra    Nur     NULL    NULL      NULL
813     G Kaur      Nur     NULL    NULL      NULL  NULL
809     P Palai     Nur     NULL    NULL      NULL
822     S Agrawal   KG1     December Tuition  Fee   575.00
773     S Garg      KG1     NULL    NULL            NULL

現在、料金を支払っていない学生のリストをクラスごとに取得しようとしていますが、正しい結果が得られません。上記のクエリに追加している条件は次のようなものです

where fr23.amount_received is NULL and c.class = 'Nur' and m.month != 'January'

1 月分の支払いを済ませていないすべての学生が一覧表示される結果を期待していますが、空の結果セットが返されます。

実際には、支払いのエントリが作成されていない学生を見つけようとしています。つまり、列の月、料金、および金額_受信には null 値が含まれます。

正しいアプローチを取っているかどうかはよくわかりません。

4

2 に答える 2

1

JOIN ON条件を次の条件に移動します。

SELECT s.admission_number, s.student_name, c.class, m.month, 
       f.fee, fr23.amount_received
FROM students s
LEFT JOIN fee_receipts fr ON s.id = fr.admission_number
LEFT JOIN fee_receipts_23_repeat fr23 ON fr.id = fr23.parent_id
    AND fr23.amount_received is NULL   -- Moved to here
JOIN class c ON s.class = c.id
LEFT JOIN fee f ON f.id = fr23.fee
LEFT JOIN months m ON m.id = fr23.month
    AND (m.month != 'January' OR m.month IS NULL) -- Added IS NULL check
于 2013-02-26T18:52:36.650 に答える
0

定番のヌルトラップ!

null 比較は、あなたが思うようには機能しません...

change m.month != 'January'

to

coalesce(m.month,'') != 'January'
于 2013-02-26T18:53:04.280 に答える