-1
我使用MYSQL创建评分系统来实现我的数据库。我想要做的是按照某个计算的百分比对每个属性进行评分。下面是该示例数据库:MySQL按百分比排名计算得分
| ID | VALUE1 | VALUE2|
-----------------------
| 2 | 5 | 20 |
| 4 | 5 | 30 |
| 1 | 3 | 5 |
| 3 | 2 | 8 |
这里是理想的输出我需要:
| ID | VALUE1 | RANK1 | Score1 | VALUE2 | RANK2 | Score2 |
---------------------------------------------------------
| 2 | 5 | 1 | 10 | 20 | 2| 8.3|
| 4 | 5 | 1 | 10 | 30 | 1| 10|
| 1 | 3 | 2 | 7.5| 5 | 4| 5|
| 3 | 2 | 3 | 5 | 8 | 3| 6.6|
的分数计算公式是
5+5*(MaxRank-rank)/(MaxRank-MinRank)
如何生成多个等级,如表?我曾尝试
SELECT
@min_rank := 1 AS min_rank
, @max_rank1 := (SELECT COUNT(DISTINCT value1) FROM table) AS max_rank1
, @max_rank2 := (SELECT COUNT(DISTINCT value2) FROM table) AS max_rank2
;
SELECT
ID
, R1
, TRUNCATE(5.0+5.0 * (@max_rank1 - R1)/(@max_rank1 - @min_rank), 2) AS Score1
, R2
, TRUNCATE(5.0+5.0 * (@max_rank2 - R2)/(@max_rank2 - @min_rank), 2) AS Score2
FROM (
SELECT
ID
, value1
, FIND_IN_SET(`value1`, (SELECT GROUP_CONCAT(DISTINCT `value1` ORDER BY `value1` DESC) FROM table)) AS R1
, value2
, FIND_IN_SET(`value2`, (SELECT GROUP_CONCAT(DISTINCT `value2` ORDER BY `value2` DESC) FROM table)) AS R2
FROM table
) ranked_table;
它正常工作与排名低于170我的数据库中有大约200多个排名的一些价值观和排名,当它返回更大然后170将被视为0。在这种情况下,排名> 170的分数将被错误计算。感谢你们。
感谢您的帮助,但它会生成错误:1052.字段列表中的列“VALUE1”不明确。我已将它们更改为数据库中的名称,但无法使用。 – ToddShih 2013-04-23 15:43:41
有更多的玩法。这比我想象的要困难得多,我必须使用一些相关的子查询,我试图避免它们往往表现不佳。 – Kickstart 2013-04-23 16:20:11