2017-01-17 3 views
-1

поэтому у меня есть проблема с моим запросом. У меня есть 2 таблицы:SQL COUNT Return Wrong Number

курсы:

user_id в этой таблице является инструктор курса.

----------------------------------------------------------------------- 
| 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' 

Как я уже сказал, этот запрос возвращает данные курса как нормальные, но возвращает 3, как count_students, когда он должен возвращать только 1. Кто-нибудь знает, почему это происходит? Любая помощь приветствуется.

+0

Пожалуйста, отметьте правильную СУБД. Для получения правильного подсчета вам понадобится предложение GROUP BY. –

+0

Возможно, это подсчет возвращенных строк, а не только из таблицы 'my_courses' – MikeVelazco

+0

Ваши данные не помогают ответить на вопрос. –

ответ

1

Это, вероятно, из-за состояния JOIN для users. Оно должно быть:

LEFT JOIN users 
     ON courses.user_id = users.user_id 

Вы должны также добавить пункт GROUP BY в запросе:

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. Затем вы можете присоединить его к остальной части вашего запроса.

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' 

Таким образом, вы избежите многократного подсчета своих учеников на курсы, возможно, с несколькими инструкторами.