2016-12-20 55 views
1

我正在構建一個將列出學生考試相關詳細信息的應用程序。mysql-插入0表示沒有值的記錄

CREATE TABLE IF NOT EXISTS `es_student` (
    `student_id` int(11) NOT NULL, 
    `fname` varchar(50) NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=latin1; 

INSERT INTO `es_student` (`student_id`, `fname`) VALUES 
(1,'John'); 

有多個科目

有一個以上的考試。但並非所有考試都是針對某個科目進行的。 例如:對於數學,所有三門考試都進行了,但英語只進行了一門。所以,我想以零作爲那些沒有進行過的考試(針對某個科目)的標誌。

CREATE TABLE IF NOT EXISTS `es_exam` (
    `exam_id` int(11) NOT NULL, 
    `exam` varchar(50) NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=latin1; 

INSERT INTO `es_exam` (`exam_id`, `exam`) VALUES 
(1,'Exam 1'), 
(2,'Exam 2'), 
(3,'Exam 3'); 

我這是怎麼保存的所有標記

CREATE TABLE IF NOT EXISTS `es_mark` (
    `mark_id` int(11) NOT NULL, 
    `exam_id` int(11) NOT NULL, 
    `subject_id` int(11) NOT NULL, 
    `student_id` int(11) NOT NULL, 
    `mark` int(11) NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=latin1; 

INSERT INTO `es_mark` (`mark_id`, `exam_id`,`subject_id`, `student_id`,`mark`) VALUES 
(1,1,1,1,11), 
(2,2,1,1,15), 
(3,3,1,1,12), 
(4,3,2,1,11), 
(5,1,3,1,1), 
(6,3,3,1,2), 
(7,2,4,1,3); 

但我寫的查詢不會顯示那些沒有進行這些檢查零。

SELECT es_mark.mark_id,es_mark.mark,es_exam.exam ,es_subject.subject,es_subject.subject_id,es_student.fname 
FROM es_mark 
LEFT JOIN es_subject ON es_mark.subject_id=es_subject.subject_id 
LEFT JOIN es_student ON es_mark.student_id=es_student.student_id 
LEFT JOIN es_exam ON es_exam.exam_id=es_mark.exam_id 
WHERE es_mark.student_id=1 
GROUP BY es_mark.mark_id 

這是我得到的結果是:

mark_id  mark exam subject  subject_id fname 
1   11  Exam 1 Math   1  John 
2   15  Exam 2 Math   1  John 
3   12  Exam 3 Math   1  John 
4   11  Exam 3 English  2  John 
5   1  Exam 1 Science  3  John 
6   2  Exam 3 Science  3  John 
7   3  Exam 2 Physics  4  John 

這就是我想要實現:

mark_id  mark exam subject  subject_id fname 
1   11  Exam 1 Math   1   John 
2   15  Exam 2 Math   1   John 
3   12  Exam 3 Math   1   John 
4   11  Exam 3 English  2   John 
0    0  Exam 2 English  2   John 
0    0  Exam 1 English  2   John 

等..

是否有可能將零作爲標記插入那些尚未進行的考試?

FIDDLE

P.S:mark_id是無關緊要的。我知道它不能重複,因爲它是一個主鍵字段,我也將0放在所需的輸出中。

回答

1

你應該嘗試這個查詢訣竅是在帶有兩個交叉連接的deliverd表中。 這些交叉連接使用表es_subject,es_exam和es_student中的數據創建4 * 3 * 1 = 12個記錄,以在這三個表之間進行所有可能的組合。

請注意,您無法獲得您嘗試實現的訂單,這就是爲什麼我的結果不同,但mark_id和mark在沒有匹配的情況下爲零。

SELECT 

    IF (es_mark.mark_id IS NULL, 0, es_mark.mark_id) AS mark_id 
, IF (es_mark.mark IS NULL, 0, es_mark.mark) AS mark 
, all_exam.exam 
, all_exam.subject 
, all_exam.subject_id 
, all_exam.fname 

FROM (
SELECT 
    * 
FROM 
    es_subject 
CROSS JOIN 
    es_exam 
CROSS JOIN 
    es_student 
) 
AS 
    all_exam 

LEFT JOIN 
    es_mark 
ON 
    all_exam.exam_id = es_mark.exam_id 
    AND 
    all_exam.subject_id = es_mark.subject_id 

LEFT JOIN 
    es_subject 
ON 
es_mark.subject_id = es_subject.subject_id 

LEFT JOIN 
    es_student  
ON 
    es_mark.student_id = es_student.student_id 

LEFT JOIN 
    es_exam 
ON 
    es_exam.exam_id = es_mark.exam_id 

ORDER BY 
    all_exam.subject_id ASC 
    , all_exam.exam ASC 

結果

mark_id mark exam subject subject_id fname 
------- ------ ------ ------- ---------- -------- 
     1  11 Exam 1 Math    1 John  
     2  15 Exam 2 Math    1 John  
     3  12 Exam 3 Math    1 John  
     0  0 Exam 1 English   2 John  
     0  0 Exam 2 English   2 John  
     4  11 Exam 3 English   2 John  
     5  1 Exam 1 Science   3 John  
     0  0 Exam 2 Science   3 John  
     6  2 Exam 3 Science   3 John  
     0  0 Exam 1 Physics   4 John  
     7  3 Exam 2 Physics   4 John  
     0  0 Exam 3 Physics   4 John 

看到演示http://www.sqlfiddle.com/#!9/bfcae/6

0
`mark` int(11) DEFAULT 0 NOT NULL 
+0

有沒有辦法讓使用SQL查詢的結果? @ kingtut007 –

+0

即使我將它設置爲默認值0;它不會像我提到的那樣獲取結果。 @ kingtut007 –

+0

你可以做一個更新語句,並添加0到空的。然後修改表結構以接受默認值0.或者,您可以像select select_mark_id,case時標記爲null,然後將0 END作爲標記,檢查,subject,subject_id,fname from es_mark – kingtut007

0

使用時應該使用DEFAULT值。 如果沒有指定其他值,則默認值將被添加到所有新記錄。

+0

我做到了。但它不會獲取它。檢查我添加的sql小提琴。 @Prashant Kumar Singh –

+0

如何獲得標記的0值?在上面的查詢中,您爲最後3個標記插入1,2,3,然後它如何給出默認值?@SajeevC –

+0

我沒有得到零。因爲只有英文考試3進行了。所以對於考試1和考試2,我試圖展示零@Prashant Kumar Singh –

0

您將需要調整mark以下幾點:

`mark` int(11) DEFAULT 0 NOT NULL 

從你的例子表明,它是拉動和將數據添加到mark場1,2 & 3.因此,它並沒有違約因爲有數據被提供給它。

對於INSERT查詢,它們必須填充所有字段,因爲即使您聲明具有DEFAULT值的列,也不允許空白字段的數據。您需要爲單獨的INSERT INTO查詢填入或不填入mark數據。下面的例子 -

INSERT INTO `es_mark` (`mark_id`, `exam_id`,`subject_id`, `student_id`,`mark`) VALUES 
(1,1,1,1,11), 
(2,2,1,1,15), 
(3,3,1,1,12), 
(4,3,2,1,11); 
INSERT INTO `es_mark` (`mark_id`, `exam_id`,`subject_id`, `student_id`) 
VALUES 
(5,2,2,1), 
(6,1,2,1); 

希望這可以幫助您在正確的軌道上獲得您想要完成的項目。