取我在数据库中存储了一系列用户青睐的一列,像5-10,10-18,18-25 ....MySQL查询从整数范围
现在我想写一个查询以获取与此范围匹配的年龄的列。
例如,如果我将年龄设置为12,则应该获取适合范围10-18的列。 如果我将年龄设为10,它应该取出适合5-10范围的列。
但事实是,我将范围存储为varchar类型(中间有一个连字符)。
所以我很好奇如何实现这一点,以及如何构建查询。
取我在数据库中存储了一系列用户青睐的一列,像5-10,10-18,18-25 ....MySQL查询从整数范围
现在我想写一个查询以获取与此范围匹配的年龄的列。
例如,如果我将年龄设置为12,则应该获取适合范围10-18的列。 如果我将年龄设为10,它应该取出适合5-10范围的列。
但事实是,我将范围存储为varchar类型(中间有一个连字符)。
所以我很好奇如何实现这一点,以及如何构建查询。
你可以使用SUBSTRING_INDEX
SELECT * FROM `yourtable` WHERE 5 BETWEEN SUBSTRING_INDEX(`agespan`,'-', 1) AND SUBSTRING_INDEX(`agespan`,'-', -1)
该查询asumes agespan是包含5-10
,12-18
柱拆分值。
SUBSTRING_INDEX(agespan
, ' - ',1)匹配字符串中的一切-
SUBSTRING_INDEX第一次出现之前(agespan
, ' - ',-1)的最后一次出现之后匹配的字符串中的一切-
谢谢,它工作真棒:) – 2011-03-11 13:07:45
我认为这将是ASY(如果你能)改变了一下数据模型,并添加到数字字段例如范围:
| MIN_AGE | MAX_AGE |
5 10
11 18
所以你可以做的之间的选择两个值。
另外我建议你不要使用相同的值为两个块,例如,如果你有5-10下一个应该是11-18。
如果你不能改变数据模型,我可能会得到数据并在PHP中处理它,或者在数据库中创建一些存储过程的王来处理事情,但这是一个不平凡的任务。
编辑1:
如果你还没有太多的范围,你可以得到所有的人都对你的PHP代码,并使用AFER这expresion转换“5-10”字符串中的两个整数:
"""
^ # Assert position at the beginning of a line (at beginning of the string or after a line break character)
( # Match the regular expression below and capture its match into backreference number 1
[0-9] # Match a single character in the range between “0” and “9”
+ # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
- # Match the character “-” literally
( # Match the regular expression below and capture its match into backreference number 2
[0-9] # Match a single character in the range between “0” and “9”
+ # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
$ # Assert position at the end of a line (at the end of the string or before a line break character)
"""
^([0-9]+)-([0-9]+)$
这样你就可以得到两个捕获组,组1与最小值和组2与最大值。此时很容易检查您的值是否在范围内。
我希望这是有意义的你,请让我知道如果不:)
这将是最好的解决方案,但正如我所说,我现在不能改变数据库设计..所以有没有像正则表达式的其他选择... – 2011-03-11 11:55:09
你会有多少个寄存器(范围)?这是一个固定的数字吗? – SubniC 2011-03-11 12:07:40
范围从0到100不等。一些示例是0-5,6-10,20-30,20-40,50-100,90-100,0-100 – 2011-03-11 12:12:58
我不能正确得到你的问题,但你应该试试这个代码了...
$query = "SELECT * FROM tablename BETWEEN $int_1 AND $int_2"
但对于VARCHAR啄我不知道......
对不起..
但我希望这会工作!
这不适用于OP案例,他使用的字段是“5-10”字符串,因此他不能使用between运算符。 – SubniC 2011-03-11 11:46:06
您需要将字符串分为两部分,即“ - ”之前的部分和“ - ”之后的部分。
SELECT range INTO @Range FROM ATable WHERE ...
/* or for a quick test: SET @range = "5-10"; */
SET @dash_pos = LOCATE("-",@Range);
SET @from = LEFT(@Range,@dash_pos-1);
SET @to = RIGHT(@Range, LENGTH(@Range) - (@dash_pos));
/*debug code to test if @from and @to are filled correctly*/
SELECT @Range, @dash_pos, @from, @to;
/*remove in production*/
SELECT * FROM tableName
WHERE tablename.age BETWEEN @from AND @to;
您是否必须坚持数据库设计?否则,我会改变这种情况 - 会让你的生活更加复杂 – Pleun 2011-03-11 11:34:05
不要以这种方式存储年龄范围。 – 2011-03-11 11:37:32
对不起,现在我不能改变数据库设计... – 2011-03-11 11:53:10