我在数据库中有一个列,用于存储一系列用户年龄,如5-10,10-18,18-25 ....
现在我想编写一个查询来获取年龄与此范围匹配的列。
例如,如果我将年龄传递为12,则应该获取适合10-18范围的列。 如果我将年龄传递为10,则应该获取适合5-10范围的列。
但事实是,我将范围存储为varchar类型(中间有一个连字符)。
所以我很好奇如何实现这一点,以及如何构建查询。
答案 0 :(得分:3)
您可以使用SUBSTRING_INDEX
SELECT * FROM `yourtable` WHERE 5 BETWEEN SUBSTRING_INDEX(`agespan`,'-', 1) AND SUBSTRING_INDEX(`agespan`,'-', -1)
此查询asgs agespan是包含5-10
,12-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,我不知道......
对不起..
但我希望这会奏效!