求Mysql非固定区间内取值的语句

csxyy 2017-11-27 10:00:32
现有两张表
一张表为数量表(上万数据)
甲 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

大家动动脑子,我已经想了好多天了......
...全文
225 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2017-12-14
  • 打赏
  • 举报
回复
当然,你愿意用循环也没问题,反正能达到目的就行
zjcxc 2017-12-14
  • 打赏
  • 举报
回复
区间怎么会写错,你自己的程序不会控制好么? 比如给用户输入的只有区间的分隔值,程序或在数据库中自动生成开始和结束值不行么?硬要用户写才行?
csxyy 2017-12-13
  • 打赏
  • 举报
回复
各位大神说的都有道理 给我了一定的启发 我最后定下来,用的是存储过程 设置一个阙值,判断是否大于阙值 比如 区间表 (此处为二维表描述,可根据实际改一维表) 甲 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这样的就可能判断错 大神们,看看,这样可行吗?有什么硬伤
kampoo 2017-11-29
  • 打赏
  • 举报
回复
楼上的做法可以实现,查询效率可以再改善一下。 数量表不变。修改区间表,四个字段: 分类(甲乙丙丁...),等级名称(ABC...), 等级区间下限(第一个等级可以设置为最小可能值,比如-1),等级区间上限(最后一个区间设置为最大可能值,比如999999) 伪码供参考:

SELECT quant.分类, rang.等级名称
-- 此处用LEFT JOIN,防止异常值超出 上下限
FROM 数量表 quant LEFT JOIN 区间表 rang ON quant.分类 = rang.分类
WHERE quant.数量 >= rang.下限 AND quant.数量 < rang.上限
这么修改,估计查询速度至少可以提高一个数量级。
zjcxc 2017-11-28
  • 打赏
  • 举报
回复
区间表结构是 名称 等级 开始数量 结束数量 甲 等级A NULL 500

select * from 数量表 as a, 区间表 as b
where a.名称 = b.名称 and a.数量 >=ifnull(b.开始数量,a.数量) and a.数量 < ifnull(b.结束数量, a.数量+1)
csxyy 2017-11-27
  • 打赏
  • 举报
回复
其实就是执行差不多excel中frequency这个函数的

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧