2017-01-17 6 views
-1

그래서 내 쿼리에 문제가 있습니다.SQL COUNT 반환 된 잘못된 번호

과정 :

이 테이블의 user_id 코스의 강사 난 2 개 테이블.

----------------------------------------------------------------------- 
| course_id | user_id | course_name  | other information | 
----------------------------------------------------------------------- 
| 6   |  1  | My Course 1  | ...    | 
----------------------------------------------------------------------- 

my_courses :

이 테이블의 user_id 코스의 학생입니다.

-------------------------------------------------- 
| user_id  | course_id | created_at   | 
-------------------------------------------------- 
| 5   | 6   | [UNIX_TIMESTAMP] | 
-------------------------------------------------- 

는 물론 가입 한 사람들의 수를 포함합니다. 나는 모든 과정 정보와 코스에 가입 한 사람들의 수를 얻고 싶습니다. 코스에 참여한 사람의 수를 제외하고 모두 예상대로 반환됩니다.

 SELECT 
      courses.*, 
      users.name, //This is the name of the instructor 
      users.last_name, //This is the last name of the instructor 
      COUNT(my_courses.user_id) as count_students 

     FROM courses 

     LEFT JOIN users 
     ON courses.user_id = courses.user_id 

     LEFT JOIN my_courses 
     ON courses.course_id = my_courses.course_id 

     WHERE courses.course_id = '6' 

내가 말했듯이,이 쿼리는 정상처럼 코스 정보를 반환하지만 그것은 단지 1을 반환해야 할 때 count_students3를 반환 : 이것은 내가 사용하고 쿼리입니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까? 어떤 도움이라도 대단히 감사합니다.

+0

올바른 RDBMS에 태그를 지정하십시오. 올바른 카운트를 얻으려면 GROUP BY 절이 필요합니다. –

+0

아마도 'my_courses' 테이블이 아닌 반환 된 행을 계산하고있을 것입니다. – MikeVelazco

+0

샘플 데이터가 질문에 도움이되지 않습니다. –

답변

1

아마도 에 대한 JOIN 조건 때문일 수 있습니다. 그것은해야한다 : 당신은 또한 당신의 쿼리에서 GROUP BY 조항을 추가해야

LEFT JOIN users 
     ON courses.user_id = users.user_id 

:

SELECT 
    c.*, 
    u.name, 
    u.last_name, 
    COUNT(mc.user_id) AS count_students 
FROM courses c 
LEFT JOIN users u 
    ON c.user_id = u.user_id 
LEFT JOIN my_courses mc 
    ON c.course_id = mc.course_id 
WHERE c.course_id = '6' 
GROUP BY 
    <columns not in the aggregate function> 

또한, 별명이 테이블은 가독성을 향상 할 수 있습니다.

+0

그래, 그게 내가 방금 알아 차린거야. 저것을 시도하게하십시오. –

+1

그것은이 오타였습니다. 제안을 주셔서 감사 드리며,이를 명심하십시오. 다시 한 번 감사드립니다! :) –

+1

내가 대답하자마자이 대답을 받아 들일 것입니다. –

1

JOIN 연산은 행의 조합 곱셈을 발생시킵니다. 당신은 그렇게 자신의 테이블에서 학생 수를 요약해야합니다.

     SELECT course_id, COUNT(*) students 
         FROM my_courses 
        GROUP BY course_id 

이렇게하면 course_id 당 1 행 또는 0 행으로 결과 세트가 제공됩니다. 그런 다음 나머지 쿼리와 연결할 수 있습니다.

SELECT courses.*, 
     users.name, //This is the name of the instructor 
     users.last_name, //This is the last name of the instructor 
     aggr.count_students 
    FROM courses 
    LEFT JOIN users ON courses.user_id = courses.user_id 
    LEFT JOIN (
       SELECT course_id, COUNT(*) students 
        FROM my_courses 
       GROUP BY course_id 
     ) aggr ON courses.course_id = aggr.course_id 
WHERE courses.course_id = '6' 

그런 식으로 두 명 이상의 강사가있는 코스의 학생 수를 세는 것을 피할 수 있습니다.