mysql - 对 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。我无法找出我在哪里做错了?
解决方案
如果使用 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
推荐阅读
- javascript - 在 Vue 中向数组添加新项目
- griddb - 如何使用旋转编码器控制电机
- c# - 如何使用 linq 和实体框架访问表中特定列的所有值?
- python - 在某些使用 Requests & BeautifulSoup 或 Selenium 的网站上不完整的 HTML 响应
- python - 在 Python 中编写 SQL 语句时出现列名无效的错误
- java - 读取并提取字符串中的多个 SQL 查询,并将它们存储在 Java 中的列表中
- python - Pandas str 方法不起作用:AttributeError:'PandasArray' 对象没有属性'_str_upper'
- java - 如何允许 Enter 键进入下一个文本字段?
- c - 枚举存储在哪里?
- haskell - 如何使用适当的 IO monad 打印无限列表中的每个项目