MYSQL里类似20-35这种格式的年龄段字段,如何进行范围查找?

mysql里有个字段age,里面存的是年龄段,格式类如图所示,如果是0-0则是不限图片描述

现在的需求是要根据年龄段查找,比如我要找出所有介于25-34岁之间的数据。

那么问题来了,如果where里面使用and的话,得到的结果很少很少,几乎没有,如果使用or,结果是变多了,但是很明显结果并不准确。如何才能准确的查找呢

感谢大家的回答,目前我用的办法是

SELECT age FROM jobs
WHERE ((substring_index(age,'-',1) >= 16 OR substring_index(age,'-',-1) = 0) OR (substring_index(age,'-',-1) <= 24)) AND !(substring_index(age,'-',1) = 0 AND substring_index(age,'-',-1) = 0);

勉强能用,但是总感觉哪里怪怪的

阅读 5.9k
9 个回答

按你说的30-55符合25-34的话,可以这样

select * from tbl where left(age,2)<=34 and right(age,2)>=25;

这个不好判断,30-55 符不符合你要的25-34的条件呢?还是必须要在25-34之内的?要看你的具体要求了

我很好奇为什么数据表结构要这样设计 为什么不是存年龄? 如果这样设计表结构 为什么还要有取25-34岁之间的数据?你的年龄只是指定的一个区间不是一个具体数值 你应该重新去设计你的表结构 不要将错就错

1、你这样存年龄段,是不是应该在另起一个key来区分年龄的跨度。
2、截图还出现1-5,2-6,3-4这样的跨度设计,如果用户要是3该选哪个合理。

一大堆对mysql内置函数都没认透的人也给别人乱指导

年龄是变化的,一般直接存出生日期吧

问题源头,数据库设计都不合理

推荐你用抽象的思维反推一下:将表里age字段存的信息看作集合 A,将 where 中的条件看作集合 C,你最终的结果是要符合什么情况?

  1. 集合 A 和集合 C 有交集

  2. 集合 A 是集合 C 的子集

  3. 集合 C 是集合 C 的自己

然后在这个基础上,你当前表结构肯定是不适合的,如果数据量不大的话,可以对数据做个离线清洗,将 age 字段拆分成 lower limit 和 upper limit,这样再做集合筛选方法就很多了。

你这表结构无法实现你说的功能

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题