MySQL NBA数据库查询最矮球员结果错误问题求助
问题根源
你的height字段是字符串类型(比如VARCHAR),MySQL对字符串做比较、取MIN/MAX或者排序时,是按字符的ASCII码顺序处理的,不是实际身高的数值大小:
- 比如数据里的
' 6-2'前面带空格,空格的ASCII码(32)比数字'5'(53)小,所以字符串排序时它会排在所有以'5'开头的身高前面,MIN(height)自然会错误地拿到这个值。 - 字符串排序时,
'5-10'会比'5-5'靠前,因为'-'之后的'1'ASCII码比'5'小,完全不符合实际身高的数值排序逻辑。
临时解决方案(不修改表结构)
如果不想改动表结构,可以把字符串格式的身高转换成总英寸数(1英尺=12英寸),再执行查询和排序:
1. 查询身高最矮的球员
SELECT * FROM players WHERE (SUBSTRING_INDEX(TRIM(height), '-', 1) * 12 + SUBSTRING_INDEX(TRIM(height), '-', -1)) = (SELECT MIN(SUBSTRING_INDEX(TRIM(height), '-', 1) * 12 + SUBSTRING_INDEX(TRIM(height), '-', -1)) FROM players);
TRIM(height):先去掉身高字符串前后的空格(比如' 6-2'里的前置空格)SUBSTRING_INDEX:拆分出英尺和英寸部分,转换为总英寸数后做数值比较,就能拿到正确的最矮球员。
2. 按身高正确排序
SELECT name, height FROM players ORDER BY SUBSTRING_INDEX(TRIM(height), '-', 1) * 12 + SUBSTRING_INDEX(TRIM(height), '-', -1) ASC;
需要从高到低排序的话,把ASC改成DESC即可。
永久优化方案(修改表结构)
从长期维护角度,把身高存储为数值类型更合理,彻底避免这类问题:
1. 添加数值类型的身高字段
新增一个存储总英寸数的字段:
ALTER TABLE players ADD COLUMN height_in_inches INT;
2. 更新字段值
把现有字符串格式的身高转换为总英寸数存入新字段:
UPDATE players SET height_in_inches = SUBSTRING_INDEX(TRIM(height), '-', 1) * 12 + SUBSTRING_INDEX(TRIM(height), '-', -1);
3. 后续查询与排序直接使用新字段
- 查询最矮球员:
SELECT * FROM players WHERE height_in_inches = (SELECT MIN(height_in_inches) FROM players);
- 按身高排序:
SELECT name, height FROM players ORDER BY height_in_inches ASC;
可选:添加索引优化性能
如果经常按身高查询或排序,给新字段加索引提升速度:
CREATE INDEX idx_height_in_inches ON players(height_in_inches);
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

