对SET数据类型的SUM操作返回错误结果

时间:2019-11-18 08:28:17

标签: mysql types aggregate-functions

应用于 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。我无法确定我在哪里做错了?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

在您的案例中,语句starRatingCHAR类型,因此您需要将CAST转换为整数SIGNED Converts value to SIGNED (a signed 64-bit integer)。 看起来像-

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