首页 > 解决方案 > 对 SET 数据类型的 SUM 运算返回不正确的结果

问题描述

SUM()应用于SET数据类型时,我得到错误的操作输出。

设置数据类型的表:

CREATE TABLE rating(
  `id` int(11) NOT NULL,
  `prodId` int(11) NOT NULL,
  `starRating` set('1','2','3','4','5') NOT NULL
)
ENGINE=MyISAM DEFAULT CHARSET=latin1;

表记录如下:

| ID | prodId | starRating |
| 1  |   1    |    1       |
| 2  |   2    |    2       |
| 3  |   3    |    3       |
| 4  |   4    |    4       |
| 5  |   5    |    5       |

最后,我的查询是这样的:

SELECT `prodId`, SUM(`starRating`) FROM `rating`
GROUP BY `prodId`

输出是:

| prodId | SUM(starRating) |
|   1    |    1            |
|   2    |    2            |
|   3    |    4            |
|   4    |    8            |
|   5    |    16           |

产品 ID 4 和 5 的输出错误,因为其评级应分别为 4 和 5。

此外,每次我们用SUM()函数计算它们时,它都将等级 3 视为 4,将等级 4 视为 8,将等级 5 视为 16。我无法找出我在哪里做错了?

标签: mysqltypesaggregate-functions

解决方案


如果使用 MySQL 8+,正确的数据类型将是:

starRating int NOT NULL,
CONSTRAINT CHECK (starRating BETWEEN 1 AND 5)

SET数据类型不按您期望的方式工作。您可以使用技巧来提取字符串值,然后在数字上下文中使用它:

select prodId, avg(concat(starRating, '')) AS avg_rating
from rating
group by prodId

推荐阅读