2017-02-06 64 views
2

我有2個表名稱表「hasil」和表「kat_soal」參加,並就關於「hasil」表中的每個「KatID」字段級別..Mysql的排名與連接表,導致不正確的

這裏我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

的數據庫,你實際使用?我在猜測MySQL,否則你已經有了'ROW_NUMBER()'。 –

+0

是的我正在使用MySQL DB @Tim Biegeleisen –

+0

您可以使用會話變量[在MySQL中模擬行號](http://www.mysqltutorial.org/mysql-row_number/)。 –

回答

1

解決問題的好例子是通過查看:http://www.fromdual.com/ranking-mysql-results

您正在使這個有點複雜:首先您取值,將該值作爲字符串,然後「找到字符串中的位置」。

從例如,如果它是作爲(未經測試)來完成它應該是完全OK

SET @rank=0; 
SELECT a.KatID,a.UserID,b.Kategori,c.Nama,a.JBenar,a.JSalah,ROUND(a.Nilai,2) as Nilai, 
@rank:[email protected]+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:[email protected]+1 AS rank 
    from hasil a 
    JOIN kat_soal b 
    ON a.KatID = b.KatID 
WHERE a.KatID='1' 
ORDER BY rank; 
+0

哇,Thx兄弟,這是我的工作 我用我的腳本前面的表,但我的腳本不工作到這張桌子哈哈, 順便說一句,謝謝你的幫助兄弟:) –