现有两张表
一张表为数量表(上万数据)
甲 1233
乙 2233
丙 3233
丁 4233另一张为区间表 (此处为二维表描述,可根据实际改一维表)
甲 500内 为等级A,500-1000 等级 B 1000-1500等级C 1500以上等级D
乙 500内 为等级A,500-1500 等级 B 1500-2000等级C 2500以上等级D
丙 1000内 为等级A,1000-2000 等级 B 2000以上上等级D (注意,无C)
丁 1000内 为等级A,1000-3000 等级 B 3000以上上等级C
如何匹配出
甲 等级B
乙 等级C
丙 等级D
丁 等级C大家动动脑子,我已经想了好多天了......
一张表为数量表(上万数据)
甲 1233
乙 2233
丙 3233
丁 4233另一张为区间表 (此处为二维表描述,可根据实际改一维表)
甲 500内 为等级A,500-1000 等级 B 1000-1500等级C 1500以上等级D
乙 500内 为等级A,500-1500 等级 B 1500-2000等级C 2500以上等级D
丙 1000内 为等级A,1000-2000 等级 B 2000以上上等级D (注意,无C)
丁 1000内 为等级A,1000-3000 等级 B 3000以上上等级C
如何匹配出
甲 等级B
乙 等级C
丙 等级D
丁 等级C大家动动脑子,我已经想了好多天了......
名称 等级 开始数量 结束数量
甲 等级A NULL 500select * from 数量表 as a, 区间表 as b
where a.名称 = b.名称 and a.数量 >=ifnull(b.开始数量,a.数量) and a.数量 < ifnull(b.结束数量, a.数量+1)
数量表不变。修改区间表,四个字段:
分类(甲乙丙丁...),等级名称(ABC...), 等级区间下限(第一个等级可以设置为最小可能值,比如-1),等级区间上限(最后一个区间设置为最大可能值,比如999999)
伪码供参考:SELECT quant.分类, rang.等级名称
-- 此处用LEFT JOIN,防止异常值超出 上下限
FROM 数量表 quant LEFT JOIN 区间表 rang ON quant.分类 = rang.分类
WHERE quant.数量 >= rang.下限 AND quant.数量 < rang.上限这么修改,估计查询速度至少可以提高一个数量级。
区间表 (此处为二维表描述,可根据实际改一维表)
甲 500内 为等级A,500-1000 等级 B 1000-1500等级C 1500以上等级D我就设定一维表
甲 等级A 0
甲 等级B 500
甲 等级C 1000然后
数量表开始判断所有数值
从1开始 到区间表最高等级,循环
比如 甲 833
第一步,数值大于0 成立 为A
下一步判断,数值大于500 成立 为B
下一步判断,数值大于1000 不成立
结束循环
发现速度也还行,200多w行。我这样做的想法是,最怕用户会写错区间,比如等级A 0-500,等级B 写了450-1000,这样类似477这样的就可能判断错大神们,看看,这样可行吗?有什么硬伤