我的桌子
+------+--------+---------+-------+--------+
| NAME | GROUP1 | SECTION | MARKS | POINTS |
+------+--------+---------+-------+--------+
| S1 | G1 | class1 | 55 | (null) |
| S16 | G1 | class1 | 55 | (null) |
| S17 | G1 | class1 | 55 | (null) |
| S2 | (null) | class2 | 33 | (null) |
| S25 | G10 | class1 | 55 | (null) |
| S26 | G10 | class1 | 55 | (null) |
| S4 | G88 | class2 | 65 | (null) |
| S5 | G88 | class2 | 65 | (null) |
| S32 | (null) | class1 | 65 | (null) |
| S7 | G5 | class1 | 32 | (null) |
| S18 | G5 | class1 | 32 | (null) |
| S10 | (null) | class2 | 78 | (null) |
| S8 | G8 | class1 | 22 | (null) |
| S20 | G8 | class1 | 22 | (null) |
| S22 | G9 | class1 | 20 | (null) |
| S23 | G9 | class1 | 20 | (null) |
| S13 | G55 | class2 | 33 | (null) |
| S36 | G55 | class2 | 33 | (null) |
+------+--------+---------+-------+--------+
SQL FIDDLE:http://www.sqlfiddle.com/#!2/f4b54/1/0
我之前提出过这个问题,根据我试图更清楚地改进问题的评论。
我试图给每个部分中分数最高的前3组提供具体要点。我想给每个在一节中得分最高的学生,第二高分的3分和第三高分的1分增加5分。组可能会出现重复标记。
例如:在class1中 - 组'G1'和'G10'得到'55'并且他们在'class1'中得到最高分。所以我想给'G1'组和'G10'组的所有学生“5分”。
G5组获得第二高分,因此该组中的所有学生都应该得到3分。同样的方式G8 - 1点。
注意:任何没有学生参与单项的学生证的学生都不会考虑这些记录。
我正在使用以下代码,此代码适用于个别学生,不知道如何给小组成员分数。
select t1.Name, t1.Section, t1.Marks from myTable t1 join
(select Section, substring_index(group_concat (distinct Marks order by Marks desc),
',', 3) as Marks3 from myTable where Section = 'class1' group by Section ) tsum
on t1.Section = tsum.Section and find_in_set(t1.Marks, tsum.Marks3) > 0
ORDER BY Section, Marks DESC, ID Desc
我的最终输出会查找一个部分。 Plz只给出一个Section(class1)
+------+--------+---------+-------+--------+
| NAME | GROUP1 | SECTION | MARKS | POINTS |
+------+--------+---------+-------+--------+
| S1 | G1 | class1 | 55 | 5 |
| S16 | G1 | class1 | 55 | 5 |
| S17 | G1 | class1 | 55 | 5 |
| S2 | (null) | class2 | 33 | (null) |
| S25 | G10 | class1 | 55 | 5 |
| S26 | G10 | class1 | 55 | 5 |
| S4 | G88 | class2 | 65 | (null) |
| S5 | G88 | class2 | 65 | (null) |
| S32 | (null) | class1 | 65 | (null) |
| S7 | G5 | class1 | 32 | 3 |
| S18 | G5 | class1 | 32 | 3 |
| S10 | (null) | class2 | 78 | (null) |
| S8 | G8 | class1 | 22 | 1 |
| S20 | G8 | class1 | 22 | 1 |
| S22 | G9 | class1 | 20 | (null) |
| S23 | G9 | class1 | 20 | (null) |
| S13 | G55 | class2 | 33 | (null) |
| S36 | G55 | class2 | 33 | (null) |
+------+--------+---------+-------+--------+
请帮帮我......
答案 0 :(得分:-1)
This答案由 Itay
提供SELECT t1.`id`, t1.`name`, t1.`group1`,
t1.`section`, t1.`MARKS`, `t_group_points`.`points`
FROM `students` t1
LEFT JOIN (
(
SELECT `t4`.`group1`, `t_points`.`points`
FROM (SELECT `t3`.`group1`, AVG(`t3`.`marks`) AS `avg`
FROM `students` `t3`
WHERE (`t3`.`section` = 'class1') AND
(`t3`.`group1` IS NOT NULL)
GROUP BY `t3`.`group1`) `t4`
INNER JOIN (
(SELECT `top`.`avg`,
CASE @curRow := @curRow + 1
WHEN '1' THEN 5
WHEN '2' THEN 3
WHEN '3' THEN 1
ELSE NULL END 'points'
FROM (SELECT `t_avg`.`avg`
FROM (SELECT `t2`.`group1`, AVG(`t2`.`marks`) AS `avg`
FROM `students` `t2`
WHERE (`t2`.`section` = 'class1') AND
(`t2`.`group1` IS NOT NULL)
GROUP BY `group1`) `t_avg`
GROUP BY `t_avg`.`avg`
ORDER BY `avg` DESC
LIMIT 0, 3) `top`, (SELECT @curRow:=0) r
) AS `t_points`)
ON (`t_points`.`avg` = `t4`.`avg`)
) AS `t_group_points`)
ON (`t_group_points`.`group1` = `t1`.`group1`)