只有那些成绩最好的学生

mpgws1up  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(355)

学生和分数之间有一个简单的关系:
学生:

+------------+-------------+
| idStudent  | NameStudent |
+------------+-------------+
|         1  | Student A   |
|         2  | Student B   |
|         3  | Student C   |
+------------+-------------+

标志:

+----------+------+-----------+
| idMarks  | mark | idStudent |
+----------+------+-----------+
|        1 | A    |         1 |
|        2 | A    |         1 |
|        3 | A    |         1 |
|        4 | A    |         2 |
|        5 | A    |         2 |
|        6 | C    |         3 |
|        7 | A    |         3 |
+----------+------+-----------+

我只想让每个通过考试的学生都得“a”

SELECT *, COUNT(mark)
FROM student S
INNER JOIN marks M ON S.idStudent = M.idStudent
WHERE M.mark = "A"
GROUP BY S.idStudent

我试过这个,但当我试图比较他们通过考试的人数和他们有一个。。。
我也尝试过子查询,但没有成功

okxuctiv

okxuctiv1#

按学生分组
找到学生获得的所有不同的标记,并使用groupconcat函数将它们放在逗号分隔的字符串中
只需过滤掉(使用having子句)只有一个完全不同的标记的标记,即
使用以下查询:

SELECT S.idStudent, 
       S.NameStudent, 
       GROUP_CONCAT(DISTINCT M.mark) AS unique_marks 
FROM student S
INNER JOIN marks M ON S.idStudent = M.idStudent
GROUP BY S.idStudent, S.NameStudent
HAVING unique_marks = 'A'
fykwrbwg

fykwrbwg2#

如果你只需要学生证,你可以 LEFT JOIN 学生在连接子句中加入一个条件,要求标记不是a。然后 WHERE 子句只包括行不匹配的学生:

SELECT Student.idStudent 
FROM Student
    LEFT JOIN Marks BelowA ON
        BelowA.idStudent = Student.idStudent
        AND BelowA.mark <> 'A'
WHERE BelowA.idStudent IS NULL
7dl7o3gd

7dl7o3gd3#

你可以用 HAVING :

SELECT S.idStudent
FROM student S
INNER JOIN marks M ON S.idStudent = M.idStudent
GROUP BY S.idStudent
HAVING COUNT(mark)=SUM(mark='A');-- compare all marks with marks that are only 'A'
                                 -- if equal then every mark is 'A'

相关问题