Как выбрать данные, равные типу X или типу Y в соединении MySQL? - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь выполнить задачу MySQL, которая имеет следующие 2 таблицы:

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

Получить информацию (SSN, имя и фамилия) о зачисленных студентах в ходе «CSC11» или «CSC12» («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     |
+-----+------------+-----------+

Поэтому, пожалуйста, объясните мне ошибку, которую я сделал здесь, и правильный запрос.

1 Ответ

0 голосов
/ 23 апреля 2020

Добавить предложение 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 является первичным ключом в таблице ученика.

...