2013-02-26 81 views
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' 

我希望結果是它會列出所有的學生,誰沒有支付一月,但它給我一個空的結果集。

其實我試圖找到沒有付款條目的學生,這意味着列月份,費用和金額將被刪除。

我不是很確定我是否採取了正確的方法?

+0

你能也許使用四個空格和反引號,表示你的問題的代碼和輸出,使之更具可讀性都有點? – Gijs 2013-02-26 18:45:57

+0

當你說'列月,費用和amount_received將有空值.',你有沒有嘗試過'm.month是NULL,f.fee是NULL,fr23.amount_received是NULL'? – 2013-02-26 18:53:06

回答

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 
+0

你爲什麼要檢查一個月*不*等於一月? – Bohemian 2013-02-26 19:30:11

+0

對不起,看起來有問題,查詢包括支付月份的月份的學生,並且月份,月份或amount_received的值不爲空。 – Joshi 2013-02-26 19:31:21

+0

虛假答案 - 條件的位置並未解決問題。添加空檢查。而你實際上正在改變查詢的性質。前進該條款將不屬於那裏 – mson 2013-02-26 19:34:03

0

經典空的陷阱!

空比較不採取行動,你可能會覺得...

change m.month != 'January' 

to 

coalesce(m.month,'') != 'January' 
+0

我試過coalesce(m.month,'')!='January',但結果是包括已付費的學生。 – Joshi 2013-02-26 19:51:35

+0

好的 - 我會爲你寫下你的查詢......最初,我只是指出了你有的概念性錯誤,並想讓你找出其餘的部分 – mson 2013-02-26 20:04:20

+0

現在加入where子句,排除那些有支付。有什麼方法可以將月份作爲參數提供。我正在使用Fabrik Joomla Addon進行mysql界面。由於我創建的視圖在月份沒有值,因此我在此字段上創建的過濾器將不會顯示任何月份,即使它顯示沒有值,因爲沒有像!=這樣的過濾器,所以我必須創建十二個月的觀點。 – Joshi 2013-02-26 20:30:06