2016-02-13 2 views
-1

4 tables RelationshipКак избежать повторений столбцов в подзапросе MySQL?

enter image description here

я получение результата свыше 4 таблицы, используя следующий запрос

SELECT 
(SELECT SUM(CASE when c.Training_Id=1 then 1 else 0 end) 
FROM courses c 
INNER JOIN enrolled_students es 
ON c.Course_Id = es.Course_Id 
) STEM, 

(SELECT SUM(CASE when c.Training_Id=2 then 1 else 0 end) 
FROM courses c 
INNER JOIN enrolled_students es ON c.Course_Id = es.Course_Id 
) MA, 
c.* FROM campus c; 

Проблема с этим запросом есть, два (2) студенты находятся в STEM и один (1) Студент в MA против Campus_Id 3, но его повторяющиеся записи против всех кампусов. я хочу, если в кампусе нет учеников, чем должно быть «0» Zero.

+1

Правильные создания и вставки заявлений и Соответствующий желаемый результат спасибо. Предпочтительно, SQLfiddle тоже. – Strawberry

ответ

1

Необходимо отфильтровать подзаголовки на Campus_Id. Но сначала вы должны использовать отдельные псевдонимы таблицы. Измените свою последнюю строку на ca.* FROM campus ca. Затем вы можете использовать предложение where в своих подзапросах (WHERE c.Campus_Id = ca.Campus_Id).

SELECT 
(SELECT SUM(CASE when c.Training_Id=1 then 1 else 0 end) 
FROM courses c 
INNER JOIN enrolled_students es 
ON c.Course_Id = es.Course_Id 
WHERE c.Campus_Id = ca.Campus_Id -- line added 
) STEM, 

(SELECT SUM(CASE when c.Training_Id=2 then 1 else 0 end) 
FROM courses c 
INNER JOIN enrolled_students es ON c.Course_Id = es.Course_Id 
WHERE c.Campus_Id = ca.Campus_Id -- line added 
) MA, 
ca.* FROM campus ca; -- line changed 

Это должно решить вашу проблему.

Для улучшения производительности вы также можете отфильтровать свои подзадачи на Training_Id. В первом подзапросе вам нужны только строки с Training_Id=1. Таким образом, вы можете изменить свой ИНЕКЕ:

WHERE c.Campus_Id = ca.Campus_Id 
    AND c.Training_Id = 1 

При том, что вы можете также использовать COUNT вместо SUM. Так что ваш подзапрос будет выглядеть так:

SELECT COUNT(1) 
FROM courses c 
INNER JOIN enrolled_students es ON c.Course_Id = es.Course_Id 
WHERE c.Campus_Id = ca.Campus_Id AND c.Training_Id = 1 

Чтобы избежать дублирования кода (ваши подзапросы почти равны), вы можете объединить все необходимые таблицы и группы по Campus_Id:

select 
    COUNT(co.Training_Id=1 OR NULL) STEM, 
    COUNT(co.Training_Id=2 OR NULL) MA, 
    ca.Campus_Id 
from campus ca 
left join courses co on co.Campus_Id = ca.Campus_Id 
left join enrolled_students es on es.Course_Id = co.Course_Id 
where co.Training_Id in (1, 2) 
group by ca.Campus_Id 
Смежные вопросы