简体   繁体   English

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

[英]How to use WHERE IN in inner join in mysql

I have 3 tables(subjects, student and exam) I'm joining to fetch a student result based on class assigned to a particular teacher. 我要加入3个表(主题,学生和考试),以根据分配给特定老师的课程获取学生成绩。

Let's say a teacher is being assigned two classes(SS 2 and SS 3) and from the exam table I only want to select students result based on the class assigned to that teacher. 假设一位老师被分配了两个班级(SS 2和SS 3),我只想从考试表中根据分配给该老师的班级选择学生成绩。

Here are the tables structures 这是表格结构

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

How can I select data from MySQL using WHERE IN in inner join in MySQL query? 如何在MySQL查询的内部联接中使用WHERE IN从MySQL中选择数据? The query below returned empty result set: 下面的查询返回空结果集:

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

To debug this: 要调试此:

  • remove the joins, remove joined rows from select, and confirm results 删除联接,从选择中删除联接的行,然后确认结果
  • add one join, make it a left join , and confirm results 添加一个联接,使其成为left join ,然后确认结果
  • change left join to inner join and confirm results left join更改为inner join并确认结果
  • Do the previous 2 steps with your other join. 与其他联接一起执行前面的2个步骤。

The inner joins can end up excluding all rows, especially with 2 of them. inner joins最终可能会排除所有行,尤其是其中的两行。

Thanks, guys. 多谢你们。 I discovered I was the one making mistakes. 我发现我是犯错误的人。 The specified values in my IN clause did not match any value in the table row which was the reason for it returning null values. 我的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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM