1

CAT などの特定の試験で採点されたマークの順にランク付けされた学生の位置を示す SQL が必要です。以下の sql は学生の位置を示しますが、試験の種類を区別しません。試験の種類を考慮せずにランク付けします。

res_id admNo stream examtyp termId  marks   grade   points  year
   1    2129    0   CAT1      1     525       C      62     2013
   2    4093    0   CAT1      1     569       B+     69     2013
   3    2129    0   CAT2      1     550       B+     67     2013
   4    4093    0   CAT2      1     556       B+     68     2013
   6    2129    0   FINAL     1     559       B+     68     2013
   7    2129    0   AVERAGE   1     545       B      66     2013
   7    4093    0   FINAL     1     581       B+     70     2013
   8    4093    0   AVERAGE   1     569       B+     69     2013




$sql = "SELECT 1 + (SELECT count(*) FROM $table a 
        WHERE a.total_marks > b.total_marks ) AS rank 
        FROM $table b WHERE admNo=? AND examCategory=? AND termId=? AND year=?  
        ORDER BY rank LIMIT 1";
$res = $this->db->query($sql, array($admNo, $examCategory, $term, $year));
4

4 に答える 4

0

これを試して -

SELECT q1.rownum
FROM 
    (
        SELECT *, @rownum:=@rownum + 1 AS rownum
        FROM $table t, (SELECT @rownum:=0) r 
        WHERE examtyp = 'CAT1'
        ORDER BY marks
    ) q1
WHERE q1.admNo=?

2)同じマークに対して同じランクを取得する要件を変更したため、次のようなことを行う必要がある場合があります-

SELECT q1.rownum
FROM 
    (
        SELECT *, @rownum:=@rownum + 1 AS rownum
        FROM 
            (SELECT DISTINCT marks FROM table1 t WHERE t.examtyp = 'CAT1' ORDER BY t.marks) q2, 
            (SELECT @rownum:=0) r 
    ) q1,
    table1 t2
WHERE 
    t2.examtyp = 'CAT1'
    AND t2.marks=q1.marks
    AND t2.admNo=?;

examCategory以上、 2箇所変更が必要です。

これは最も最適化されたクエリではありません..しかし、それはあなたの仕事をします.

3)次の学生の増分カウントを取得するための3番目の要件に従って、これでうまくいくかもしれません-

SELECT ROWNUM
FROM
(
    SELECT q1.marks, min(q1.rownum) AS rownum
    FROM 
    (
        SELECT t1.marks, @rownum:=@rownum + 1 AS rownum
        FROM 
            table1 t1, 
            (SELECT @rownum:=0) r
        WHERE
            t1.examtyp='CAT1'
        ORDER BY t1.marks asc
    ) q1 
    GROUP BY q1.marks
) q2,
table1 t2
WHERE 
    t2.examtyp = 'CAT1'
    AND t2.marks=q2.marks;
    AND t2.admNo=?;
于 2013-05-09T05:59:10.493 に答える
0

これはあなたのために働くはずです:

SELECT  res_ID,
        admNo,
        stream,
        examtyp,
        termId,
        grade,
        points,
        `year`,
        Position
FROM    (   SELECT  @r:= CASE WHEN @e = examtyp THEN @r + CASE WHEN @p = points THEN 0 ELSE @i END ELSE 1 END Position,
                    @i:= CASE WHEN @p = points THEN @i + 1 ELSE 1 END incr,
                    @e:= Examtyp,
                    @p:= points,
                    res_ID,
                    admNo,
                    stream,
                    examtyp,
                    termId,
                    grade,
                    points,
                    `year`
            FROM    T,
                    (SELECT @e:= '') e,
                    (SELECT @r:= 0) r,
                    (SELECT @p:= 0) p,
                    (SELECT @i:= 0) i
            ORDER BY examtyp, points
        ) T
WHERE   T.admNo = 4093
AND     T.Examtyp = 'CAT1'

これは、提案されている変数を使用するという同じ原則を使用しますが、examtyp新しい試験タイプごとに位置を 0 にリセットして によって分割し、同点に対処するために以前のポイントも記録するため、3 人が同じマークを取得した場合はすべて同じポジションを取る。

SQL Fiddle の例

フィドルの下部ペインで結果AVERAGEが等しいことに注意してください。両方が位置= 1を取得します

于 2013-05-09T08:11:21.683 に答える
0

を試すQuery

SET @rank=0;
select
@rank := @rank+1 AS rank 
result_id,
marks_scored,
admNo,
Aggregate_points,
year
from tale_name
order by marks_scored DESC
于 2013-05-08T18:13:38.383 に答える
0

このクエリを試してください

クエリ 1 :

select 
@rn:=if(@prv=examtyp, @rn+1, 1) as rId, 
admNo,
@prv:=examtyp as exmtyp,
marks
from table1
join
(select @rn:=0,@prv:='') tmp
order by exmtyp, marks desc

SQLフィドル

| RID | ADMNO |  EXMTYP | MARKS |
---------------------------------
|   1 |  4093 | AVERAGE |   569 |
|   2 |  2129 | AVERAGE |   545 |
|   1 |  4093 |    CAT1 |   569 |
|   2 |  2129 |    CAT1 |   525 |
|   1 |  4093 |    CAT2 |   556 |
|   2 |  2129 |    CAT2 |   550 |
|   1 |  4093 |   FINAL |   581 |
|   2 |  2129 |   FINAL |   559 |

編集

クエリ 1 :

select * from (
select 
@rn:= @rn+1 as rId, 
admNo,
examtyp,
marks
from table1
join
(select @rn:=0) tmp
where examtyp='CAT1'
order by examtyp, marks desc
) tmp where tmp.admNo=2129

SQLフィドル

| RID | ADMNO | EXAMTYP | MARKS |
---------------------------------
|   2 |  2129 |    CAT1 |   525 |
于 2013-05-09T05:50:15.167 に答える