按学科名称查找已注册多个学科的学生

Find Students who have registered in multiple subject by subject name

StudentID | SubCode | SubName
-------------------------------
   1          1       Math
   1          2       Science
   1          3       English
   2          1       Math
   2          2       Science
   3          2       Science
   4          1       Math
   4          3       English

这是我的主题table。

如何找到注册如下的同学

  1. 只注册了数学的学生
  2. 已注册数学和英语的学生
  3. 已注册科学、数学和英语的学生

在单个 SQL 查询中。

我试过这样

SELECT DISTINCT  
    `stud_id` FROM  `subj_assign` 
WHERE  
   `subj_id` =  '1,2'
   AND STATUS =  '1'
ORDER BY  
   `subj_assign`.`stud_id` ASC     

您可以使用 union 来聚集从多个查询返回的记录。

select * from table where subName like 'Math'
union 
select * from table where subName like 'Math' and subName like 'English'
union 
select * from table where subName like 'Math' and subName like 'English' and subName like 'Science'

试试这个:

SELECT s.stud_id, 
      (CASE WHEN A.stud_id IS NOT NULL THEN 'Yes' ELSE 'No' END) OnlyMaths, 
      (CASE WHEN B.stud_id IS NOT NULL THEN 'Yes' ELSE 'No' END) MatchsAndEnglish, 
      (CASE WHEN C.stud_id IS NOT NULL THEN 'Yes' ELSE 'No' END) MatchsAndEnglishANDScience
FROM students s
LEFT JOIN ( SELECT stud_id 
            FROM subj_assign 
            WHERE subj_id = 1 AND STATUS =  '1'
          ) AS A ON s.stud_id = A.stud_id
LEFT JOIN ( SELECT stud_id 
            FROM subj_assign 
            WHERE subj_id IN (1, 3) AND STATUS =  '1'
            GROUP BY StudentID 
            HAVING COUNT(DISTINCT subj_id) = 2
          ) AS B ON s.stud_id = B.stud_id
LEFT JOIN ( SELECT stud_id 
            FROM subj_assign 
            WHERE subj_id IN (1, 2, 3) AND STATUS =  '1'
            GROUP BY StudentID 
            HAVING COUNT(DISTINCT subj_id) = 3
          ) AS C ON s.stud_id = C.stud_id

试试这两个查询,它们很相似但以不同的方式显示数据:

SELECT StudentID,
       CASE
         WHEN Sum(CASE
                    WHEN SubCode IN( 1, 2, 3 ) THEN 1
                    ELSE 0
                  END) = 3 THEN 'All'
         WHEN Sum(CASE
                    WHEN SubCode IN( 1, 3 ) THEN 1
                    ELSE 0
                  END) = 2 THEN 'MathsEnglish'
         WHEN Sum(CASE
                    WHEN SubCode IN( 1 ) THEN 1
                    ELSE 0
                  END) = 1 THEN 'Maths'
       END AS subjects
FROM   yourtable
GROUP  BY StudentID
HAVING subjects IS NOT NULL;

SELECT StudentID,
       CASE
         WHEN Sum(CASE
                    WHEN SubCode IN( 1, 2, 3 ) THEN 1
                    ELSE 0
                  END) = 3 THEN 'YES'
         ELSE 'NO'
       END AS `all`,
       CASE
         WHEN Sum(CASE
                    WHEN SubCode IN( 1, 3 ) THEN 1
                    ELSE 0
                  END) = 2 THEN 'YES'
         ELSE 'NO'
       END AS `MathsEnglish`,
       CASE
         WHEN Sum(CASE
                    WHEN SubCode IN( 1 ) THEN 1
                    ELSE 0
                  END) = 1 THEN 'YES'
         ELSE 'NO'
       END AS `Maths`
FROM   yourtable
GROUP  BY StudentID 

SQLFIDDLE

您需要使用 Having Clause 过滤群组。我不知道为什么您需要在单个查询中获得所有结果。试试这个。

SELECT StudentID,
       'Only Maths' as Subjects
FROM   #testt
GROUP  BY StudentID
HAVING Count(CASE WHEN SubCode = '1' THEN 1 END) = 1
       AND Count(*) = 1 
UNION ALL
SELECT StudentID,
       'Maths and English'
FROM   #testt
GROUP  BY StudentID
HAVING Count(CASE WHEN SubCode = '1' THEN 1 END) = 1
       AND Count(CASE WHEN SubCode = '3' THEN 1 END) = 1
UNION ALL
SELECT StudentID,
       'Maths,Sceince and English'
FROM   #testt
GROUP  BY StudentID
HAVING Count(CASE WHEN SubCode = '1' THEN 1 END) = 1
       AND Count(CASE WHEN SubCode = '3' THEN 1 END) = 1
       AND Count(CASE WHEN SubCode = '2' THEN 1 END) = 1 

如果您已经显示完整的 table,那么只有三个科目,并且提供学生 ID 和科目 ID 对于 table 是唯一的,只需将科目 ID 相加即可:

select stud_id, group_concat(sub_name)
from subj_assign
group by stud_id
having sum(subj_id) = 1 -- Math only
or sum(subj_id) = 4 -- Math and English only
or sum(subj_id) = 6 -- Math and English and Science
order by stud_id asc;

如果 table 包含更多主题:

select stud_id, group_concat(sub_name)
from subj_assign
group by stud_id
having sum(subj_id) = 1 -- Math only
or (min(subj_id) = 1 and max(subj_id) = 3 and sum(subj_id) = 4) -- Math and English only
or (min(subj_id) = 1 and max(subj_id) = 3 and sum(subj_id) = 6) -- Math and English and Science
order by stud_id asc;

当然,还有许多其他聚合可用于评估,例如 count(*)count(case when ... end)max(case when ... end)