使用连接表的Mysql排名,结果不正确

时间:2017-02-06 07:13:16

标签: mysql sql sql-server

我有2个表名表' hasil'和表' kat_soal'加入并给予每个' KatID'在' hasil'表..

这是我的强制表:

HasilID  KatID  UserID  JBenar  JSalah  Nilai

15       1      1000    2       1       66.66666666666666
16       3      1000    2       0       100
17       1      1001    1       2       33.33333333333333
18       3      1001    1       1       50
19       1      1002    3       0       90
20       3      1002    2       0       80

并且有我的kat_soal表

KatID Kategori          Lama
1     IPA               30
2     IPS               30
3     Matematika        30
4     Bahasa Indonesia  20
5     Bahasa Inggris    20

这个我的查询生成排名:

SELECT a.KatID,a.UserID,b.Kategori,c.Nama,a.JBenar,a.JSalah,ROUND(a.Nilai,2) as Nilai,
    FIND_IN_SET( a.Nilai, l.list) AS rank
      from hasil a
      JOIN kat_soal b
      ON a.KatID = b.KatID 
    JOIN  datauser c
    ON a.UserID=c.UserID
CROSS JOIN
  (SELECT GROUP_CONCAT( a2.Nilai ORDER BY a2.Nilai DESC ) as list
    FROM hasil a2) l 
WHERE a.KatID='1'
ORDER BY a.Nilai DESC;

我的结果

//FOR KatID=1
KatID   UserID   Kategori   Nama    JBenar   JSalah   Nilai  rank
1       1002     IPA        ratam   3        0        90.00  2
1       1000     IPA        Tarsan  2        1        66.67  4
1       1001     IPA        wisnu   1        2        33.33  6

//FOR KatID=3
3       1000    Matematika  Tarsan  2        0        100.00 1
3       1002    Matematika  ratam   2        0        80.00  3
3       1001    Matematika  wisnu   1        1        50.00  5

我的预期结果

//FOR KatID=1
KatID   UserID   Kategori   Nama    JBenar   JSalah   Nilai  rank
1       1002     IPA        ratam   3        0        90.00  1
1       1000     IPA        Tarsan  2        1        66.67  2
1       1001     IPA        wisnu   1        2        33.33  3

//FOR KatID=3
3       1000    Matematika  Tarsan  2        0        100.00 1
3       1002    Matematika  ratam   2        0        80.00  2
3       1001    Matematika  wisnu   1        1        50.00  3

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

解决问题的好例子是:http://www.fromdual.com/ranking-mysql-results

你使这有点复杂:首先你取值,使值为字符串,然后“在字符串中查找位置”。

从示例中,如果以(未经测试)完成,则应该完全正确:

SET @rank=0;
SELECT a.KatID,a.UserID,b.Kategori,c.Nama,a.JBenar,a.JSalah,ROUND(a.Nilai,2) as Nilai,
@rank:=@rank+1 AS rank
  from hasil a
  JOIN kat_soal b
  ON a.KatID = b.KatID 
JOIN  datauser c
ON a.UserID=c.UserID
WHERE a.KatID='1'
ORDER BY rank;

编辑:更改了排序 - 您期望在决赛中按排名排序。

以下是不使用表datauser进行测试的任何1的脚本:

SET @rank=0;
SELECT a.KatID,a.UserID,b.Kategori,a.JBenar,a.JSalah,ROUND(a.Nilai,2) as Nilai,
@rank:=@rank+1 AS rank
  from hasil a
  JOIN kat_soal b
  ON a.KatID = b.KatID 
WHERE a.KatID='1'
ORDER BY rank;