应用于 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。我无法确定我在哪里做错了?
答案 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)
在您的案例中,语句starRating
是CHAR
类型,因此您需要将CAST转换为整数SIGNED Converts value to SIGNED (a signed 64-bit integer)
。
看起来像-
SELECT `prodId`, SUM(`starRating` AS SIGNED) FROM `rating`GROUP BY `prodId`