Mysql rank with join table,结果不正确

标签 mysql sql sql-server

我有 2 个表名表 'hasil' 和表 'kat_soal' 加入 'hasil' 表上的每个 '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 table

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

谁能帮帮我?

最佳答案

解决问题的好例子是查看: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 的脚本,供 any1 测试:

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;

关于Mysql rank with join table,结果不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42062173/

相关文章:

javascript - Sequelize ORM 中联接表的条件

sql - 在 WHERE 子句中使用 IsNull()

sql-server - Java & SQL Server 异常 : The statement did not return a result set

sql - 如果最后一个字符是 SQL 中的 char(10),则删除行中的最后一个字符

mysql - 选择所有不持有任何产品的客户

mysql - mysql 5.5.13有多稳定

mysql - 我应该在删除多行后重置表索引/优化吗?

php - FLASH、PHP、MySQL 连接

Java:一种方法中顺序 SQL 语句的问题

sql - 如何填充表格中缺失的日期