-4

私のテーブル

+------+--------+---------+-------+--------+
| 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 フィドル: http://www.sqlfiddle.com/#!2/f4b54/1/0

質問をより明確に改善しようとしたコメントによると、私は以前にこの質問を提起しました。

各セクションで最高点を獲得した最初の 3 つのグループに特定のポイントを与えようとしています。セクションで最高の成績を収めた生徒にはそれぞれ 5 ポイント、2 番目に高い成績のグループには 3 ポイント、3 番目に高いグループには 1 ポイントを追加したいと思います。グループに重複マークが発生する場合があります。

例: クラス 1 - グループ 'G1' と 'G10' は '55' を取得し、'class1' で最高点を取得しました。ですから、グループ「G1」と「G10」のすべての生徒に「5」ポイントを与えたいと思います。

グループ G5 は 2 番目に高い点数を獲得したため、そのグループのすべての生徒は 3 点を与える必要があります。同じように G8 - 1 ポイント。

plz note : グループ ID を持っていない学生は、その学生が単一の項目に参加していると見なされません。

私は次のコードを使用しています。このコードは個々の学生には問題なく機能しますが、グループ メンバーにポイントを与える方法がわかりません。

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

私の最終的な出力はセクションを探します。セクション (class1) を 1 つだけ指定してください

+------+--------+---------+-------+--------+
| 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) |
+------+--------+---------+-------+--------+

親切に私を助けて..

4

1 に答える 1

-1

この答えは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`)
于 2013-08-24T06:53:35.400 に答える