如何避免重复MySQL子查询中的列?

时间:2016-02-13 07:23:01

标签: mysql subquery

4 tables Relationship

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

1 个答案:

答案 0 :(得分:1)

您需要按Campus_Id过滤子选择。但首先必须使用不同的表别名。将您的上一行更改为ca.* FROM campus ca。然后,您可以在子选择(WHERE c.Campus_Id = ca.Campus_Id)中使用where子句。

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子句更改为:

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