如何在MySQL的内部联接中使用WHERE IN

时间:2019-02-24 13:01:48

标签: mysql

我要加入3个表(科目,学生和考试),以根据分配给特定老师的班级获取学生成绩。

假设一位老师被分配了两个班级(S.S 2和S.S 3),我只希望从考试表中根据分配给该老师的班级选择学生成绩。

这是表格结构

    CREATE TABLE `student` (
      `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `regiNo` varchar(100) NOT NULL,
      `session` varchar(15) NOT NULL,
      `class` varchar(50) NOT NULL,
      `class_group` varchar(26) NOT NULL,
      `firstName` varchar(60) NOT NULL,
      `middleName` varchar(60) NOT NULL,
      `lastName` varchar(60) NOT NULL

     )

INSERT INTO `student` (`id`, `regiNo`, `session`, `class`, `class_group`,  `firstName`, `middleName`, `lastName`) VALUES
(8, 'TS2018007',  '2018', 'Primary One', 'Science',  'ADEWUYI', 'o', 'ODERINDE'),
(9, 'TS2018009',  '2018', 'Primary One', 'N/A',  'Ayodele', 'Jumide', 'Boros')

     CREATE TABLE `exam` (
      `examid` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `Roll_Number` varchar(30) NOT NULL,
      `sub_id` varchar(20) NOT NULL,
      `mid_term` varchar(5) NOT NULL DEFAULT '',
      `count_assessment` varchar(4) NOT NULL DEFAULT '',
      `scored` varchar(30) NOT NULL,
      `total_score` varchar(4) NOT NULL DEFAULT '',
      `sub_highest` varchar(4) NOT NULL DEFAULT '',
      `sub_lowest` varchar(4) NOT NULL DEFAULT '',
      `first_term` varchar(4) NOT NULL DEFAULT '',
      `second_term` varchar(4) NOT NULL DEFAULT '',
      `third_term` varchar(4) NOT NULL DEFAULT '',
      `avg_score` varchar(4) NOT NULL DEFAULT '',
      `internaltype` varchar(30) NOT NULL,
      `Class` varchar(40) NOT NULL,
      `Year` varchar(4) NOT NULL
    )

INSERT INTO `exam` (`examid`, `Roll_Number`, `sub_id`, `mid_term`, `count_assessment`, `scored`, `total_score`, `sub_highest`, `sub_lowest`, `first_term`, `second_term`, `third_term`, `avg_score`, `internaltype`, `Class`, `Year`) VALUES
(32, 'TS2018007', 'Eng', '54', '20', '50', '134', '80', '70', '45', '12', '43', '45', 'First', 'J.S.S 3', '2019'),
(33, 'TS2018007', 'Agr', '32', '32', '12', '34', '56', '23', '34', '12', '56', '20', 'First', 'J.S.S 3', '2019'),
(34, 'TS2018007', 'math', '54', '20', '45', '12', '45', '34', '34', '12', '12', '23', 'First', 'J.S.S 3', '2019'),
(35, 'TS2018007', 'bio', '54', '27', '23', '23', '12', '12', '45', '55', '12', '45', 'First', 'J.S.S 2', '2019');


    CREATE TABLE `subjects` (
      `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `subect_code` varchar(55) NOT NULL,
      `subjects` varchar(255) NOT NULL
    )

INSERT INTO `subjects` (`id`, `subect_code`, `subjects`) VALUES
(12, 'Eng', 'English Language'),
(13, 'Agr', 'Agricultural Science'),
(17, 'math', 'Mathematics'),
(20, 'bio', 'Biology'),
(21, 'fur', 'Further Maths'),
(25, 'che', 'Chemistry'),
(26, 'geo', 'Geography');

如何使用MySQL查询中的内部连接中的WHERE IN 从MySQL中选择数据? 下面的查询返回了空结果集:

SELECT distinct s.regiNo, s.firstName as fname, s.middleName as mname, s.lastName as lname, s.gender, s.class_group, c.subjects,
e.mid_term, e.count_assessment, e.examid, e.scored, e.internaltype, e.Class, e.Year,e.total_score,e.sub_highest,e.sub_lowest,e
.first_term,e.second_term,e.third_term,e.avg_score FROM student s inner join exam e on s.regiNo = e.Roll_Number 
inner join subjects c on e.sub_id = c.subect_code WHERE e.Class IN('S.S 2', 'S.S 3')

2 个答案:

答案 0 :(得分:0)

要调试此:

  • 删除联接,从选择中删除联接的行,然后确认结果
  • 添加一个联接,使其成为left join,然后确认结果
  • left join更改为inner join并确认结果
  • 与其他联接一起执行前2个步骤。

inner joins可能最终排除所有行,尤其是其中2行。

答案 1 :(得分:0)

谢谢,伙计们。我发现我是犯错误的人。我的IN子句中指定的值与表行中的任何值都不匹配,这就是它返回空值的原因。

SELECT DISTINCT s.regiNo, 
s.firstName as fname, 
s.middleName as mname, 
s.lastName as lname, 
s.gender, 
s.class_group, 
c.subjects, 
e.mid_term, 
e.count_assessment, 
e.examid, 
e.scored, 
e.internaltype, 
e.Class, 
e.Year,
e.total_score,
e.sub_highest,
e.sub_lowest,
e .first_term,
e.second_term,
e.third_term,
e.avg_score 
FROM student s 
INNER JOIN exam e 
ON s.regiNo = e.Roll_Number 
INNER JOIN subjects c ON 
e.sub_id = c.subect_code 
WHERE e.Class IN('J.S.S 3','J.S.S 2') 
GROUP BY
s.regiNo, 
s.firstName, 
s.middleName, 
s.lastName, 
s.gender, 
s.class_group, 
c.subjects, 
e.mid_term, 
e.count_assessment, 
e.examid, 
e.scored, 
e.internaltype, 
e.Class, 
e.Year,
e.total_score,
e.sub_highest,
e.sub_lowest, 
e.first_term,
e.second_term,
e.third_term,
e.avg_score