2013-06-08 3 views
-1

У меня есть два стола студента и экзамен выглядетьMysql: Выберите максимальное количество из разных ид

student(studentid,lastname,firstname,class)

exam(studentid,course,mark,result)

Мне нужно найти лучшие студенты имеют отметку с 90, 100 в каждом классе.

это то, что мне нужно

class  studentid best 
K11  K1101  3  
K12  K1203  2 
K13  K1305  2 

это мой первый код

Select st.class, st.studentid, count(st.mark) as best 
From exam e inner join student st on e.studentid = st.studentid 
Where e.mark = 90 or e.mark = 100 
Group by e.studentid 

возвращение

class  studentid best 
K11  K1101  3 
K12  K1201  1 
K12  K1203  2 
K13  K1305  2 

поэтому я стараюсь другой код

Select st.class, st.studentid, count(st.mark) as best 
From exam e inner join student st on e.studentid = st.studentid 
Where e.mark = 90 or e.mark = 100 
Group by st.class 
Having count(e.mark) = 
     (Select max(count) 
     From (Select count(ex.mark) count 
       From exam ex 
       Where ex.mark = 90 or ex.mark = 100 
       Group by ex.studentid) a) 

и до сих пор получить неправильный ответ

class  studentid best 
K11  K1101  3 
K12  K1201  3 

UPDATE DATA

Sorry о неясном вопросе. Мне нужно найти учеников в каждом классе есть много курсов с точным счетом 90 или 100. Это мои данные

экзамен

studentid course mark result 
K1101  DB  100 Pass 
K1101  CD  90 Pass 
K1101  DIP  95 Pass 
K1101  OT  100 Pass 
K1102  DB  97 Pass 
K1102  CD  65 Pass 
K1102  DIP  70 Pass 
K1102  OT  44 Fail 
K1201  DB  85 Pass 
K1201  CD  90 Pass 
K1201  DIP  76 Pass 
K1201  OT  65 Pass 
K1202  DB  69 Pass 
K1202  CD  32 Fail 
K1202  DIP  57 Pass 
K1202  OT  96 Pass 
K1203  DB  90 Pass 
K1203  CD  87 Pass 
K1203  DIP  90 Pass 
K1203  OT  91 Pass 
K1301  DB  75 Pass 
K1301  CD  79 Pass 
K1301  DIP  78 Pass 
K1301  OT  63 Pass 
K1305  DB  90 Pass 
K1305  CD  93 Pass 
K1305  DIP  100 Pass 
K1305  OT  80 Pass 

В этом случае в классе К11, студент K1101 есть 2 курса с 100 , один с 90, так что я считаю 3

+2

Показать данные источника. –

+0

Просто любопытно, не должно быть 'e.mark МЕЖДУ 90 И 100'. Было бы бессмысленно присуждать студенту, у которого должен быть точный счет (90, 100), но не между ними. И может ли студент с идентификатором 'K1201' быть на самом деле иметь один счет 90 или 100? – invisal

+0

Вы можете показать некоторые данные образца? –

ответ

0

попробовать это

Select st.class, st.studentid, count(mark) as best 
From exam e inner join student st on e.studentid = st.studentid 
Where e.mark between 90 and 100 
and e.mark in (select max(mark) from exam group by studentid) 
Group by st.class 
+0

, так что в классе K12 count (mark) вернет 3, потому что он группирует отметку всех учеников. Спасибо за помощь. –

0

Ваши результаты не кажутся согласуется с формулировкой вопроса. Вы говорите: «Мне нужно найти лучших учеников с отметкой 90, 100 в каждом классе». Однако в таблице показан только один ученик на класс, даже если в столбце счетчика три.

Если вам нужно знать что-то в классе, то вам следует группировать класс. Если вам нужно показать всех учеников. Собираем их вместе:

Select st.class, group_concat(st.studentid), count(st.mark) as best 
From exam e inner join 
    student st 
    on e.studentid = st.studentid 
Where e.mark in (90, 100) 
Group by st.class; 

Если вы хотите, чтобы подсчитать число класса для студента:

Select st.studentid, group_concat(st.class), count(st.mark) as best 
From exam e inner join 
    student st 
    on e.studentid = st.studentid 
Where e.mark in (90, 100) 
Group by st.studentid; 
+0

жаль, что у меня плохой вопрос. Но это вернет счет (st.mark) в 3, и он объединяет всех учеников класса K12 –