Как исправить код ошибки 1241: операнд должен содержать 1 столбец (столбцы) в запросе mysql? - PullRequest
0 голосов
/ 10 ноября 2019
select firstName, lastName from students, courses, registration
where students.studentID = registration.studentID 
and courses.courseCode = registration.courseCode 
and gender = 'M' and courseName = 'Database Systems' 
in(select firstName, lastName 
from students, courses, registration
where students.studentID = registration.studentID 
and courses.courseCode = registration.courseCode 
and gender = 'M' and courseName = 'C++');``

Мне нужно найти учеников мужского пола, которые приняли обе системы баз данных и C ++, для этого мне нужно оставить за столами студентов, регистрацию и курсы,

Ответы [ 3 ]

0 голосов
/ 10 ноября 2019

В вашем предложении отсутствует какой-либо столбец try

select 
   firstName, lastName 
from students, courses, registration
where students.studentID = registration.studentID 
and courses.courseCode = registration.courseCode 
and gender = 'M' and courseName = 'Database Systems' 
and students.studentID
in (select studentID 
from students, courses, registration
where students.studentID = registration.studentID 
and courses.courseCode = registration.courseCode 
and gender = 'M' and courseName = 'C++');
0 голосов
/ 10 ноября 2019

Этот запрос может быть легче написан с использованием предложения HAVING, чтобы проверить, что количество курсов, которые студент выбрал из набора («Системы баз данных», «C ++»), равно 2:

SELECT s.studentID, s.firstName, s.lastName 
FROM students s
JOIN registration r ON s.studentID = r.studentID 
JOIN courses c ON c.courseCode = r.courseCode 
WHERE s.gender = 'M' AND c.courseName IN ('Database Systems', 'C++')
GROUP BY s.studentID, s.firstName, s.lastName
HAVING COUNT(DISTINCT c.courseName) = 2

Примечание. Я переписал ваши JOIN s в предпочтительном стиле с условиями ON.

0 голосов
/ 10 ноября 2019

Ваш запрос не выполнен из-за способа использования оператора in, для которого требуется имя столбца или выражение в левой части.

На основании вашего описания вашей цели, я подозреваю, что ваш запросможно переписать для использования условия exists с коррелированными подзапросами для фильтрации, например:

select 
    firstName, 
    lastName 
from students s
where 
    gender = 'M'
    and exists(
        select 1
        from courses c
        inner join registration r on c.courseCode = r.courseCode 
        where 
            c.courseName = 'Database Systems' 
            and s.studentID = r.studentID 
    )
    and exists(
        select 1
        from courses c
        inner join registration r on c.courseCode = r.courseCode 
        where 
            c.courseName = 'C++' 
            and s.studentID = r.studentID 
    )   

Другое возможное решение - использование агрегации с предложением having для фильтрации:

select s.firstName, s.lastName 
from students s
inner join registration r 
    on s.studentID = r.studentID 
inner join courses c 
    on  c.courseCode = r.courseCode 
    and c.courseName in ('Database Systems',  'C++' )
where s.gender = 'M'
group by s.studentID, s.firstName, s.lastName 
having count(distinct c.courseName) = 2
...