Php 在MySQL中使用不同尺度计算平均等级

Php 在MySQL中使用不同尺度计算平均等级,php,mysql,average,Php,Mysql,Average,我想计算MySQL表中一组行的平均等级。问题是,根据您登录的用户的不同,可能会使用不同的比例 示例比例可以是: 1-5 1-10 A-F(显然不包括E) 在数字比例中,数字越高越好,但在字母比例中,数字越低越好 如何进行SQL查询以获得正确的平均值 平均数示例: 5,5,4,2=4 8,10,7,6,4=7 A、 A,C=B A、 F,B,B=C F、 F,B,D=D 我使用的查询是: SELECT CHAR(ROUND(AVG(ORD(UPPER(grade))))) AS avera

我想计算MySQL表中一组行的平均等级。问题是,根据您登录的用户的不同,可能会使用不同的比例

示例比例可以是:

  • 1-5
  • 1-10
  • A-F(显然不包括E)
在数字比例中,数字越高越好,但在字母比例中,数字越低越好

如何进行SQL查询以获得正确的平均值

平均数示例:

  • 5,5,4,2=4
  • 8,10,7,6,4=7
  • A、 A,C=B
  • A、 F,B,B=C
  • F、 F,B,D=D
我使用的查询是:

SELECT CHAR(ROUND(AVG(ORD(UPPER(grade))))) AS average
这里的问题是最后一个例子。使用该查询得到的结果是
E
,但这不是有效的分数,应该是
D


我不知道怎么处理这件事。如果MySQL中的量表排除了值(例如A-F量表排除了E),那么获得平均分数的最佳方法是什么?如果需要,我也可以用PHP进行计算。

创建另一个具有字母和值之间映射的表,对其进行一次连接以获取当前字母的值,然后对其进行第二次连接以将平均值转换回字母。

无需进行类似意大利面条的SQL查询,最好的方法是创建一个带有坡度->坡度点值的映射表

比如

Table Values
grade  value
    A | 4
    B | 3
    C | 2
    etc.
然后,你会做平均值

SELECT ROUND(AVG(v.value)) FROM Grades g 
           INNER JOIN Values v on g.grade = v.grade
从那以后,你就可以回到表中得到结果

SELECT * FROM (
     SELECT ROUND(AVG(grade)) avg FROM Grades g 
               INNER JOIN Values v on g.value = v.value
             ) avgs 
INNER JOIN Values v2 on avgs.avg = v2.values