首页 > 解决方案 > 如何在 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     |
+-----+------------+-----------+

所以请向我解释我在这里犯的错误和正确的查询。

标签: mysqljoingroup-bywhere-clause

解决方案


添加一个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是学生表中的主键。


推荐阅读