MySQL我将如何处理这种类型的点系统?

MySQL我将如何处理这种类型的点系统?,mysql,Mysql,从上面提取的精确数据示例 +---------+-------------------+------+------+ | NAME | TITLE | SIZE | RANK | +---------+-------------------+------+------+ | A | Hippo | H | 1 | | A | Hippo | M | 1 | | A

从上面提取的精确数据示例

+---------+-------------------+------+------+
| NAME    | TITLE             | SIZE | RANK |
+---------+-------------------+------+------+
| A       | Hippo             | H    |  1   |
| A       | Hippo             | M    |  1   |
| A       | Hippo             | H    | N/A  |
| A       | Hippo             | H    |  1   |
| A       | Hippo             | H    | N/A  |
| B       | Snail             | H    |  1   |
| B       | Snail             | M    |  1   |
| B       | Snail             | L    |  1   |
| C       | Dog               | H    |  1   |
| C       | Dog               | M    |  1   |
+---------+-------------------+------+------+
要点如下:

+---------+-------------------+------+------+
| A       | Hippo             | H    |  1   |
| A       | Hippo             | M    |  1   |
| A       | Hippo             | H    | N/A  |
| A       | Hippo             | H    |  1   |
| A       | Hippo             | H    | N/A  |
+---------+-------------------+------+------+
  • 河马在尺寸栏中有4个
    H
  • H
    总计可以等于70
  • 因此,70/4=17.5
  • 这意味着每个
    H
    只能得到17.5分
  • 如果存在“等级”,则获得分数
  • 河马现在只有两个“等级”
  • 因此河马获得(17.5)x(2)=35分
  • Hippo在“尺寸”栏中还有一个
    M
  • 因此
    M
    =20/1=20
  • 因此河马获得20分
  • 河马在尺寸栏中没有
    L
  • 因此没有得分
  • 总共35(从
    H
    )+20(从
    M
    )+0(从
    L
    )=55
期望输出

H = 70 points
M = 20 points
L = 10 points

在复杂的子选择和联接之后,如何在MySQl中进行这种复杂的评分/变量处理,下面是您期望的结果:

+---------+----------+-------+
| NAME    | TITLE    | SCORE |
+---------+----------+-------+
| A       | Hippo    |   55  |
| B       | Snail    |  100  |
| C       | Dog      |   90  |
+---------+----------+-------+
select c.name,c.title,sum(score) from (
select b.name, b.title, avg_point*needcount as score from (select name, title, size,    count(size),  (case when size='H' then 70 when size='M' then 20 when size='L' then 10 end )/ count(size)  as avg_point from points group by name,title,size ) a
join 
(select name, title, size, count(size) as needcount from points where rank group by name, title, size) b
on a.name = b.name
and a.title = b.title
and a.size = b.size) c group by c.name,c.title;