только студенты, которые имеют лучшую оценку - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть простое соотношение между студентом и оценками:

Учащийся:

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

Я хочу, чтобы только студенты, имеющие«А» в каждом экзамене, который они сдали

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

Я пробовал это, но зашел в тупик, когда пытался сравнить количество экзаменов, которые они сдали, и число А, которое у них было ...

Я также пытался с подзапросами, но это не сработало

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Вы можете использовать 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'
0 голосов
/ 24 сентября 2018

Если вам просто нужны идентификаторы учеников, вы можете 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
0 голосов
/ 24 сентября 2018
  • Группировка по ученику
  • Найдите все отличительные оценки, полученные учеником, и поместите их в строку через запятую, используя Group_concat функция
  • Просто фильтрout (используя с предложением ) те, которые имеют только одну общую отличительную отметку, то есть A

Используйте следующий запрос:

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...