Mysql查询从整数范围获取

时间:2011-03-11 11:28:04

标签: mysql

我在数据库中有一个列,用于存储一系列用户年龄,如5-10,10-18,18-25 ....

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

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

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

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

4 个答案:

答案 0 :(得分:3)

您可以使用SUBSTRING_INDEX

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

此查询asgs agespan是包含5-1012-18的列。

SUBSTRING_INDEX(agespan,' - ',1)匹配-

第一次出现之前字符串中的所有内容

SUBSTRING_INDEX(agespan,' - ', - 1)匹配-

最后一次出现后字符串中的所有内容

答案 1 :(得分:1)

我认为这将是asy(如果可以的话)更改数据模型并添加到范围的数字字段,例如:

| MIN_AGE | MAX_AGE |
    5           10
    11          18

因此您可以在两个值之间进行选择。

我还建议你不要对两个块使用相同的值,例如,如果你有5-10,那么下一个应该是11-18。

如果您无法更改数据模型,我可能会获取数据并在PHP中处理它,或者在数据库中制作一些存储过程之王以处理de thing,但这是一项非常重要的任务。

编辑1:

如果没有太多范围,你可以将它们全部用于PHP代码,并使用此表达式将“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组包含min,第2组包含最大值。此时很容易检查您所拥有的值是否在范围内。

我希望这对你有意义,如果没有,请告诉我。)

答案 2 :(得分: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;

答案 3 :(得分:0)

我没有正确地回答您的问题,但您应该尝试使用此代码...

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

但对于那种varchar,我不知道......

对不起..

但我希望这会奏效!