Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在给定的表格中找到每个主题的前三名_Mysql_Sql - Fatal编程技术网

Mysql 如何在给定的表格中找到每个主题的前三名

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 -

只想展示每个主题的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    -  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 |