2011-03-11 71 views
1

取我在数据库中存储了一系列用户青睐的一列,像5-10,10-18,18-25 ....MySQL查询从整数范围

现在我想写一个查询以获取与此范围匹配的年龄的列。

例如,如果我将年龄设置为12,则应该获取适合范围10-18的列。 如果我将年龄设为10,它应该取出适合5-10范围的列。

但事实是,我将范围存储为varchar类型(中间有一个连字符)。

所以我很好奇如何实现这一点,以及如何构建查询。

+1

您是否必须坚持数据库设计?否则,我会改变这种情况 - 会让你的生活更加复杂 – Pleun 2011-03-11 11:34:05

+0

不要以这种方式存储年龄范围。 – 2011-03-11 11:37:32

+0

对不起,现在我不能改变数据库设计... – 2011-03-11 11:53:10

回答

3

你可以使用SUBSTRING_INDEX

SELECT * FROM `yourtable` WHERE 5 BETWEEN SUBSTRING_INDEX(`agespan`,'-', 1) AND SUBSTRING_INDEX(`agespan`,'-', -1) 

该查询asumes agespan是包含5-1012-18柱拆分值。

SUBSTRING_INDEX(agespan, ' - ',1)匹配字符串中的一切-

SUBSTRING_INDEX第一次出现之前(agespan, ' - ',-1)的最后一次出现之后匹配的字符串中的一切-

+0

谢谢,它工作真棒:) – 2011-03-11 13:07:45

1

我认为这将是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与最大值。此时很容易检查您的值是否在范围内。

我希望这是有意义的你,请让我知道如果不:)

+0

这将是最好的解决方案,但正如我所说,我现在不能改变数据库设计..所以有没有像正则表达式的其他选择... – 2011-03-11 11:55:09

+0

你会有多少个寄存器(范围)?这是一个固定的数字吗? – SubniC 2011-03-11 12:07:40

+0

范围从0到100不等。一些示例是0-5,6-10,20-30,20-40,50-100,90-100,0-100 – 2011-03-11 12:12:58

0

我不能正确得到你的问题,但你应该试试这个代码了...

$query = "SELECT * FROM tablename BETWEEN $int_1 AND $int_2" 

但对于VARCHAR啄我不知道......

对不起..

但我希望这会工作!

+1

这不适用于OP案例,他使用的字段是“5-10”字符串,因此他不能使用between运算符。 – SubniC 2011-03-11 11:46:06

1

您需要将字符串分为两部分,即“ - ”之前的部分和“ - ”之后的部分。

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;