2014-12-05 52 views
1

我有一個MySQL表和它下面的值:篩選學生尚未

表名「結果」

Reg.No SubjectCode Attempt Pass/Fail 
112108 CMIS 1113 1  fail 
112110 CMIS 1114 1  pass 
112119 CMIS 1114 1  fail 
112108 CMIS 1113 2  fail 
112107 CMIS 1113 1  fail 
112108 CMIS 1113 3  pass 

學生能有幾次試圖傳遞的主題。 學生應通過每個科目獲得學位。 一些學生通過第一次嘗試。 有些需要超過3次嘗試。 但是學生可以嘗試,直到他/她通過。 但有些仍然失敗。 因此,我想獲得仍然無法通過該科目的學生的註冊編號。
例如:112119112107仍然無法通過他們的主題。
我無法爲此問題撰寫查詢。

+0

-----失敗----- – Strawberry 2014-12-05 19:43:20

+0

你至少試過了嗎? http://dev.mysql.com/doc/refman/5.7/en/select.html – 2014-12-05 19:44:16

+0

你是否對某個特定的科目代碼或所有科目感興趣? – 2014-12-05 20:34:45

回答

2

我會建議使用聚合:

SELECT `Reg.No`, SubjectCode, SUM(`Pass/Fail` = 'Pass') 
FROM results 
GROUP BY `Reg.No`, SubjectCode 
HAVING SUM(`Pass/Fail` = 'Pass') = 0; 

HAVING子句計算結果爲每個學生,當然在最後一列是'Pass'的數量。在MySQL中,布爾值在數字上下文中被視爲整數,其中true爲1.因此,sum(通過/失敗= 'Pass')計算學生通過課程的次數。 = 0說學生從未通過課程。

建議不要在列名中加入特殊字符,如/.。這需要轉義列,只是使代碼更難寫,因爲它充滿了反引號。

+0

是的,先生。我將來會把你的建議付諸實踐。無論如何,你的查詢對我有用。謝謝你的主人,爲你伸出援助之手。 – Punuth 2014-12-06 05:58:46

+0

非常感謝 – 2014-12-06 10:09:36

0

是否這樣?

SELECT Req.No FROM results WHERE `Pass/Fail` = 'fail'; 

這是非常基本的SQL。你應該閱讀一些教程。

編輯:有一點玩弄確定後,我來到這個查詢:

SELECT `Req.No` FROM results WHERE `Req.No` NOT IN(SELECT `Req.No` FROM results WHERE `Pass/Fail` = 'pass'); 

http://sqlfiddle.com/#!2/b2bd80/17

+0

這不是我想要的查詢。這個查詢讓我註冊了所有失敗的學生。但是我想讓reg.no的學生仍然無法通過這個主題。例如112119仍然無法通過CMIS 1114和112107,仍然無法通過CMIS 1113.我只想過濾這兩個。112108通過他的第三次嘗試的主題。所以不希望他的號碼。我只想要誰仍然無法通過這個主題。我希望你明白了我的觀點。謝謝你 – Punuth 2014-12-05 19:51:55

+0

我明白你的意思了。請將該說明添加到您的原始問題中。您可能需要重新制作表格,但不確定。 – dmikester1 2014-12-05 19:57:55

+0

謝謝主席先生,你能否建議對我的桌子進行任何修改? – Punuth 2014-12-05 20:05:12

1

你並不需要爲這個子查詢。

SELECT `Req.No`, `SubjectCode`, max(`Pass/Fail`) AS `Pass/Fail` 
FROM results 
GROUP BY 1, 2 
HAVING max(`Pass/Fail`) = 'fail' 

假設Pass/Fail是字符串類型,所以'pass'>'fail'
你只會得到那些嘗試失敗的學生,而不是那些從未嘗試過(並且根本不在此表中)的學生。

我真的不會使用帶有特殊字符的列名。非常容易出錯。

+0

謝謝先生..您的查詢完美適合我。是的,我對SQL很陌生。我仍然在學習和練習它。也謝謝你的建議。 – Punuth 2014-12-06 05:57:13