2013-03-04 65 views
0
UPDATE student as s 
LEFT JOIN takes as t ON s.ID = t.ID 
LEFT JOIN course as c ON t.course_id = c.course_id 
SET s.tot_cred = s.tot_cred - COALESCE(c.credits, 0) 
WHERE t.grade = 'F' 
OR 
t.grade IS NULL 

我試圖更新減去任何一類的信用值在學生tot_cred學生已經失敗,品位在發生關係=「F」,或正在服用,等級中取IS NULL。IS NULL沒有找到所有的空值列MYSQL

以上查詢適用於'take'關係中的單個'F'級別。然而,它只適用於成績列中'take'關係中的4個NULL值之一。

對SQL來說很新穎,我覺得查詢中的某些內容只是查找第一個NULL值,而不是全部。

表:

mysql> select ID, tot_cred 
    -> from student; 
+-------+----------+ 
| ID | tot_cred | 
+-------+----------+ 
| 00128 |  102 | 
| 12345 |  32 | 
| 19991 |  80 | 
| 23121 |  110 | 
| 44553 |  56 | 
| 45678 |  38 | 
| 54321 |  54 | 
| 55739 |  38 | 
| 70557 |  0 | 
| 76543 |  58 | 
| 76653 |  60 | 
| 98765 |  98 | 
| 98988 |  112 | 
+-------+----------+ 

我想改變這裏的tot_cred如果相應的等級爲F或NULL

mysql> select ID, course_id, grade 
    -> from takes 
    -> order by grade; 
+-------+-----------+-------+ 
| ID | course_id | grade | 
+-------+-----------+-------+ 
| 76543 | CS-001 | NULL | 
| 54321 | CS-001 | NULL | 
| 12345 | CS-001 | NULL | 
| 98988 | BIO-301 | NULL | 
| 98988 | BIO-101 | A  | 
| 76543 | CS-319 | A  | 
| 76543 | CS-101 | A  | 
| 00128 | CS-101 | A  | 
| 12345 | CS-190 | A  | 
| 12345 | CS-315 | A  | 
| 54321 | CS-101 | A- | 
| 55739 | MU-199 | A- | 
| 45678 | CS-319 | B  | 
| 19991 | HIS-351 | B  | 
| 98765 | CS-315 | B  | 
| 45678 | CS-101 | B+ | 
| 54321 | CS-190 | B+ | 
| 44553 | PHY-101 | B- | 
| 12345 | CS-101 | C  | 
| 76653 | EE-181 | C  | 
| 23121 | FIN-201 | C+ | 
| 98765 | CS-101 | C- | 
| 45678 | CS-101 | F  | 
+-------+-----------+-------+ 

這裏就是品位。有4個NULL值和1 F.

mysql> select course_id, credits 
    -> from course; 
+-----------+---------+ 
| course_id | credits | 
+-----------+---------+ 
| BIO-101 |  4 | 
| BIO-301 |  4 | 
| CS-101 |  4 | 
| CS-190 |  4 | 
| CS-315 |  3 | 
| CS-319 |  3 | 
| CS-347 |  3 | 
| EE-181 |  3 | 
| FIN-201 |  3 | 
| HIS-351 |  3 | 
| MU-199 |  3 | 
| PHY-101 |  4 | 
+-----------+---------+ 

這是我從中得到的學分數。

剛剛意識到3個NULL值來自實驗室中的上一個問題。這些條目沒有在課程關係中表示。我的問題解決了。我爲所有的浪費時間感到非常抱歉。如果你想有內更換JOIN代替LEFT JOIN,你可能只想更新這些記錄其作爲匹配的記錄

UPDATE student as s 
INNER JOIN takes as t ON s.ID = t.ID 
INNER JOIN course as c ON t.course_id = c.course_id 
SET s.tot_cred = s.tot_cred - COALESCE(c.credits, 0) 
WHERE t.grade = 'F' 
OR 
t.grade IS NULL 
+0

我添加了3個用於查詢的表格 – 2013-03-04 07:29:18

+1

您應該將答案標記爲已接受,而不是將「已解決」添加到問題標題。 – 2013-03-04 08:52:37

回答

0

嘗試將其改變了這一點。

UPDATE student s 
LEFT JOIN takes as t ON s.ID = t.ID and t.grade = 'F' OR t.grade is NULL 
LEFT JOIN course as c ON t.course_id = c.course_id 
SET tot_cred = tot_cred - COALESCE(c.credits, 0); 

檢查小提琴here

+0

仍然隻影響2行 – 2013-03-04 07:19:25

+0

最後一個怎麼樣? – Othman 2013-03-04 07:21:55

+0

仍然相同的2行受影響 – 2013-03-04 07:30:14

0

檢查:

+0

仍然隻影響它以前做過的2行。 – 2013-03-04 07:32:23

+0

用小提琴檢查更新的查詢。由於** LEFT JOIN **所有行將受影響。如果你想只爲那些等級爲'F'的人做,那麼將** LEFT JOIN **改成** INNER JOIN **。 – 2013-03-04 08:46:10

0

我沒有意識到的是,NULL值的3在使用過程中相對於未派代表出席。這個查詢工作得很好,對所有浪費的時間抱歉。

+0

沒問題你用什麼類型的軟件進行MySQL管理? – Othman 2013-03-04 07:44:24

+0

不知道他們在用什麼。我正在用phpmyadmin進行編輯。這只是我大學的一級數據庫課程。 – 2013-03-04 08:41:34