mysql-为没有值的记录插入0

mysql-为没有值的记录插入0,mysql,left-join,Mysql,Left Join,我正在创建一个应用程序,它将列出一个学生的考试相关细节 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 (

我正在创建一个应用程序,它将列出一个学生的考试相关细节

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_subject` (
  `subject_id` int(11) NOT NULL,
  `subject` varchar(50) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=latin1;

INSERT INTO `es_subject` (`subject_id`, `subject`) VALUES
(1,'Math'),
(2,'English'),
(3,'Science'),
(4,'Physics');
考试不止一次。但并非所有的考试都是针对某一科目进行的。 数学三门考试都考过了,但英语只有一门。所以,我想显示零分,作为一门尚未进行的科目的考试分数

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');
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
这就是我存储所有标记的方式

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);
但是我写的查询没有显示那些没有进行的考试为零

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');
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
等等

对于那些尚未进行的考试,是否可以插入零作为分数


注:马克·迪德是无关紧要的。我知道它不能重复,因为它是一个主键字段,我也在所需的输出中输入了0。

使用时应该使用默认值。
`mark` int(11) DEFAULT 0 NOT NULL
如果未指定其他值,则默认值将添加到所有新记录中。

您需要将标记调整为以下值:

`mark` int(11) DEFAULT 0 NOT NULL
从您的示例中可以看出,它使用1、2和3将数据拉入并添加到标记字段中。因此,它不是默认为0,因为有数据提供给它

对于INSERT查询,它们必须填充所有字段,因为即使使用默认值声明列,也不允许数据字段为空。对于一个填充了标记数据和没有填充标记数据的查询,您需要有单独的INSERT INTO查询。下面的例子-

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);

希望这有助于您在正确的轨道上完成项目的目标。

您应该尝试此查询。技巧在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 

请参见演示

是否有使用sql查询获得结果的方法@KingTut007即使我将其设置为默认值0;它不会得到我提到的那样的结果@KingTut007您可以执行update语句并将0添加到空语句中。然后修改表结构以接受默认值0。或者,您可以像选择mark_id,空时的案例标记,然后0结束为mark,考试,主题,主题id,es_mark的fname,但不是预期结果@Kingtut007和我在小提琴上得到的结果一样@是的。但它无法取回它。检查我添加的sql FIDLE@Prashant Kumar Singhh您是如何得到分数的0值的?在上面的查询中,您为最后3个分数插入了1,2,3,然后它是如何给出默认值的?@SajeevCI没有得到零。对于英语,只进行了exam3。所以对于exam1和exam2,我试图在Prashant Kumar Singh中显示零