Mysql 如何在给定的表格中找到每个主题的前三名
只想展示每个主题的3个顶级人物Mysql 如何在给定的表格中找到每个主题的前三名,mysql,sql,Mysql,Sql,只想展示每个主题的3个顶级人物 id - Name - Subject - Marks 1 - ABC - MAT - 90 2 - ABC - SCI - 80 3 - ABC - ENG - 90 4 - ABC - HIS - 96 5 - ABC - PHY - 70 6 - ABC - CHE - 43 7 - XYZ - MAT - 90 8 - XYZ - SCI -
id - Name - Subject - Marks
1 - ABC - MAT - 90
2 - ABC - SCI - 80
3 - ABC - ENG - 90
4 - ABC - HIS - 96
5 - ABC - PHY - 70
6 - ABC - CHE - 43
7 - XYZ - MAT - 90
8 - XYZ - SCI - 80
9 - XYZ - ENG - 90
10 - XYZ - HIS - 96
11 - XYZ - PHY - 70
13 - XYZ - CHE - 43
etc .....
您可以使用变量来实现这一点
ABC - MATH - 90
XYZ - MATH - 90
DEF - MATH - 80
etc
您可以使用变量来实现这一点
ABC - MATH - 90
XYZ - MATH - 90
DEF - MATH - 80
etc
我用你的数据创建了一个
我包括两个额外的学生,所以查询从4只返回3
select m1.id, max(m1.marks) 'marks', max(m1.subject) 'subject'
from marks m1
left join marks m2 on m2.subject =m1.subject and ( m2.marks>=m1.marks )
left join marks m3 on (m3.subject =m2.subject) and m3.id<>m1.id and m3.id<>m2.id and m3.marks>=m2.marks
left join marks m4 on (m4.subject =m3.subject) and m4.id<>m1.Id and m4.id<>m2.id and m4.id <>m3.id and m4.marks>=m3.marks
left join marks m12 on (m12.subject =m1.subject and m12.subject =m2.subject ) and m12.marks>m1.marks and m12.marks<m2.marks
left join marks m23 on (m23.subject=m2.subject and m23.subject=m3.subject) and ( m23.marks>m2.marks and m23.marks < m3.marks)
where
(m4.id is null)
and m12.id is null
and m23.id is null
group by m1.id
order by max(m1.subject) asc, max(m1.marks) desc
并创建此派生代码以简化下一个代码。其想法是创建一个具有3个编号000-100+名称的唯一代码,以便我可以在左外连接期间使用和L.comb对您的数据进行排序,我创建了一个
我包括两个额外的学生,所以查询从4只返回3
select m1.id, max(m1.marks) 'marks', max(m1.subject) 'subject'
from marks m1
left join marks m2 on m2.subject =m1.subject and ( m2.marks>=m1.marks )
left join marks m3 on (m3.subject =m2.subject) and m3.id<>m1.id and m3.id<>m2.id and m3.marks>=m2.marks
left join marks m4 on (m4.subject =m3.subject) and m4.id<>m1.Id and m4.id<>m2.id and m4.id <>m3.id and m4.marks>=m3.marks
left join marks m12 on (m12.subject =m1.subject and m12.subject =m2.subject ) and m12.marks>m1.marks and m12.marks<m2.marks
left join marks m23 on (m23.subject=m2.subject and m23.subject=m3.subject) and ( m23.marks>m2.marks and m23.marks < m3.marks)
where
(m4.id is null)
and m12.id is null
and m23.id is null
group by m1.id
order by max(m1.subject) asc, max(m1.marks) desc
并创建此派生代码以简化下一个代码。我的想法是创建一个具有3个编号000-100+名称的唯一代码,这样我可以在左外连接期间使用和L进行排序。comb您应该获得无所不在的徽章。非常令人印象深刻的回答我只想添加代码参考您应该获得无所不在的徽章。非常令人印象深刻的回答我只想添加代码参考
CREATE TABLE s_course AS
SELECT `id`, `Name`, `Subject`, `Marks`, concat(LPAD(`Marks`, 3, '0'), `Name`) as comb
FROM Courses;
SELECT *
FROM (
SELECT L.Subject, L.Marks, L.Name, count(*) as rn
FROM s_course L
left outer join s_course R
ON L.Subject = R.Subject
AND L.comb <= R.comb
GROUP BY L.Subject, L.comb
ORDER BY L.Subject, L.comb
) t
WHERE rn <= 3
ORDER BY Subject, rn
| Subject | Marks | Name | rn |
|---------|-------|------|----|
| CHE | 48 | PQR | 1 |
| CHE | 48 | FGH | 2 |
| CHE | 43 | XYZ | 3 |
|---------|-------|------|----|
| ENG | 95 | PQR | 1 |
| ENG | 92 | FGH | 2 |
| ENG | 90 | XYZ | 3 |
|---------|-------|------|----|
| HIS | 96 | XYZ | 1 |
| HIS | 96 | ACB | 2 |
| HIS | 91 | PQR | 3 |
|---------|-------|------|----|
| MAT | 95 | PQR | 1 |
| MAT | 95 | FGH | 2 |
| MAT | 90 | XYZ | 3 |
|---------|-------|------|----|
| PHY | 75 | PQR | 1 |
| PHY | 70 | XYZ | 2 |
| PHY | 70 | ACB | 3 |
|---------|-------|------|----|
| SCI | 80 | XYZ | 1 |
| SCI | 80 | ACB | 2 |
| SCI | 75 | PQR | 3 |