2013-07-24 6 views
0

Я пытаюсь отображать самые высокие 3 метки на каждом классе, я использую следующий код.Дисплей 3 Максимальные значения столбца, включают повторяющиеся значения с условием

SELECT Name, Marks FROM mytable AS t1 
INNER JOIN 
    (SELECT DISTINCT(Marks) AS best_marks FROM mytable WHERE Class='class1' ORDER BY Marks DESC LIMIT 3) AS t2 
ON t1.Marka = t2.best_marks ORDER BY Marks DESC, Name ASC; 

Этот код предоставил 'Eggplant' из Stackoverfolow.

Будет работать нормально, когда нет класса.

Моя таблица является

Name  Marks  Class 
S1  90  class1 
S2  55  class3 
S3  60  class4 
S4  90  class1 
S5  55  class2 
S6  60  class3 
S7  88  class1  
S8  45  class6 
S9  88  class1 
s10  76  class3 
s11  92  class3 
s12  44  class1 

Как вышеупомянутой таблицы, я хочу показать 3 записи включают повторяющиеся записи и класс

Так что мой окончательный вывод выглядит

Name  Marks  Class 
S1  90  class1 
S4  90  class1 
S7  88  class1  
S9  88  class1 

Name  Marks  Class 
S5  55  class2 

Name  Marks  Class 
s11  92  class3 
s10  76  class3 
S6  60  class3 


Name  Marks  Class 
S3  60  class4 

Name  Marks  Class 
S8  45  class6 

Пожалуйста, пожалуйста, помогите мне ,

ответ

1

Существует несколько способов решения этой проблемы. Ниже помещается отчетный Marks для каждого класса в список и занимает первые три из них. Затем он сравнивает Marks в данных с этим списком:

select t1.* 
from t1 join 
    (select class, substring_index(group_concat(distinct Marks order by Marks desc), ',', 3) as Marks3 
     from mytable t1 
     group by class 
    ) tc 
    on t1.class = tc.class and find_in_set(t1.Marks, tc.Marks3) > 0 
order by class, Marks desc; 
Смежные вопросы