mysql - 如何在 MySQL 连接中选择等于 Type X 或 Type Y 的数据?
问题描述
我正在尝试完成具有以下 2 个表的 MySQL 任务。
INSERT INTO STUDENT VALUES
(100,'Oliver','Jake','Fearon Rd','Morrisville',13408,'NY'),
(101,'Jack','Connor','Road 124','Visalia',93291,'CA'),
(102,'Harry','Callum','Worth Ave','California',20619,''),
(103,'Bella','Swan','Butler Rd','Morrisville',13408,'NY'),
(104,'Charlie','Kyle','Womack Rd','Sanford',27330,'NC'),
(105,'Jinnie','Reece','Boyer Ave','Hammonton',08037,'NJ'),
(107,'Jessica','Davies','Worth Ave','California',20619,'CA'),
(108,'Isabella','Brown','Hawkins Ave','Sanford',27330,'NC');
INSERT INTO ENROLLS VALUES
(100,'CSC11',1),
(100,'CSC11',2),
(101,'CSC11',1),
(101,'CSC12',1),
(101,'CSC13',1),
(102,'CSC12',1),
(103,'CSC12',1),
(104,'CSC13',1),
(105,'CSC12',1),
(105,'CSC13',1),
(105,'CSC14',1),
(106,'CSC14',1),
(107,'CSC14',1),
(108,'CSC14',1);
检索参加“CSC11”或“CSC12”课程的学生的信息(SSN、名字和姓氏)(“CSC11”和“CSC12”是课程编号)。注意:MySQL 不支持“INTERSECT”。
根据学生的问题,应该有 100,102,103 和 105 作为答案。我试过以下给出的 101 也包括 CSC11 和 CSC12。
mysql> SELECT s.SSN, s.First_Name, s.Last_Name
-> FROM STUDENT s
-> JOIN ENROLLS e ON s.SSN= e.SSN
-> WHERE (e.CourseNo = 'CSC11') OR (e.CourseNo = 'CSC12')
-> GROUP BY e.SSN;
+-----+------------+-----------+
| SSN | First_Name | Last_Name |
+-----+------------+-----------+
| 100 | Oliver | Jake |
| 101 | Jack | Connor |
| 102 | Harry | Callum |
| 103 | Bella | Swan |
| 105 | Jinnie | Reece |
+-----+------------+-----------+
所以请向我解释我在这里犯的错误和正确的查询。
解决方案
添加一个HAVING
子句,断言存在一个但不是两个课程编号:
SELECT s.SSN, s.First_Name, s.Last_Name
FROM STUDENT s
INNER JOIN ENROLLS e ON s.SSN = e.SSN
WHERE e.CourseNo IN ('CSC11', 'CSC12')
GROUP BY e.SSN
HAVING MIN(e.CourseNo) = MAX(e.CourseNo);
演示
注意:以上假设SSN
是学生表中的主键。