MySQL - выберите все уникальные записи, которые не содержат определенных значений - PullRequest
0 голосов
/ 06 февраля 2019

(Извините, если вопрос был задан ранее или он слишком прост)

Выберите все уникальные имена из таблицы Учащиеся, где уровень = «Средняя школа» и не занимаются спортом («Футбол», «Баскетбольные предметы).

ID      name    level          subject

00001   John    High school Science
00002   John    High school Math
00003   John    High school *Soccer*
00004   John    High school English
00005   Andrea  High school Math
00006   Andrea  High school Science
00007   Andrea  High school English
00008   Susan   High school History
00009   Susan   High school English
00010   Susan   High school Math
00011   Michael High school Since
00012   Michael High school Math
00013   Michael High school *Basketball*
00014   Michael High school English
00015   Mary    Middle school   Math

Я пытался использовать 'EXISTS', как это:

SELECT ID, name, level FROM Students WHERE level = 'High school' AN NOT EXISTS(
   SELECT * FROM Students WHERE subject IN ('Soccer', 'Basketball') );

Результат должен быть:

Andrea  High school
Susan   High school

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Пожалуйста, попробуйте это.

SELECT DISTINCT ID, name, level FROM Students WHERE level = 'High school' AND  subject NOT IN ('Soccer', 'Basketball') ;
0 голосов
/ 06 февраля 2019

Вам необходимо сопоставить ваш подзапрос с внешним запросом, используя столбец name:

SELECT DISTINCT s.name,  s.level
FROM students s
WHERE s.level = 'High school'
AND NOT EXISTS (
    SELECT 1 FROM students s1 WHERE s1.name = s.name AND s1.subject IN ('Soccer', 'Basketball')  
)

Без корреляции подзапрос фактически проверяет, является ли all записи в students имеют тему, отличную от 'Soccer' и 'Basketball', что является ложным, в результате чего внешний запрос не возвращает результатов.

Эта демонстрация на БДСкрипка с вашими образцами дает:

| name   | level       |
| ------ | ----------- |
| Andrea | High school |
| Susan  | High school |
...