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中显示零