2009-10-15 6 views
0

학생과 나를 아직 수업하지 않은 학생 (저는 CS 학생뿐만 아니라 음악 교사입니다)이 실제로 시도하고 있습니다. 이미 수업을 예약 한 모든 사람들, 내 실수는 무엇입니까?데이터베이스 쿼리로 예기치 않은 결과가 발생했습니다.

SELECT DISTINCT student.person_id FROM student, lesson 
WHERE lesson.student = student.person_id 
AND (select count(*) 
    FROM lesson 
    WHERE student = student.person_id 
    AND start_time > NOW()) = 0 

답변

2

시도 :

SELECT DISTINCT s.person_id 
    FROM STUDENT s 
WHERE NOT EXISTS(SELECT NULL 
        FROM LESSONS l 
        WHERE l.student = s.person_id 
        AND l.start_time > NOW()) 
0

로버트,

이 쿼리는 학생들을위한 데이터베이스 목록을 더 미래 예정 교훈을 선택, 당신이 정보를 저장 할 수있는 방법에 대한 합리적인 가정을 만들기. 학생이 과거 수업을 받았는지 여부는 중요하지 않습니다. 나는 영어 문장이 어색하기 때문에 "아직 수업을 예약하지 않았다"는 것이 무슨 뜻인지 확신 할 수 없습니다. "레슨을 예약하지 않았거나받지 못했다"와는 다른가요? "not 아직"이라는 단어는 현재 시간 이전이 아니라 이미 예약 된 예약 수업과 "아직 예약되지 않은"수업을 계속 추적하고 있음을 나타냅니다. 수정 구슬이 없으면 학생이 예약 한 수업을 어떻게 계속 추적하는지 모르지만 아직 알 수는 없습니다.

어쨌든 특정 학생의 경우 데이터베이스에 미래에 시작되는 수업이 없다면 결과에 해당 학생이 표시됩니다 (현재 시작한 해당 학생의 수업 목록과 관계 없음). 과거).

검색어에 대한 이상한 점도 있습니다. 그 사실은 카운트에 따라 결과를 제한하기 전에 lesson.student = student.person_id에있는 "lesson"및 "student"테이블에 가입하는 것입니다. 어떤 조건을 만족하는 학생들의 목록을 원한다면 Rexem의 쿼리에서와 같이 외부 쿼리의 FROM 절에만 "student"가 필요합니다.

레슨 기록이없는 학생 (수업 시작 시간과 관계없이)을 보려면 rexem의 쿼리가 작동해야합니다. DISTINCT 테이블 "student"가 각 학생을 한 번만 나열하면 불필요합니다. EXISTS를 사용할 때의 이점은 COUNT와는 달리 EXISTS의 경우 카운트를 0으로 비교하기 전에 각 학생의 향후 수업의 총 개수를 세지 않아도된다는 제안을하지 않는 것입니다. EXISTS를 사용하면 그러한 교훈이 발견되면 학생의 장래 수업을 계속 찾을 필요가 없습니다.

관련 문제