我将一些范围信息存储在数据库中,如min_age和max_age,例如:
id min_age max_age
1 10 14
2 15 16
3 17 20
我想使用PHP(或MySql)进行一些验证,以便在创建另一条记录之前,确保范围不与现有范围重叠。所以,id = 4,min_age = 21,max_age = 25就可以了,但id = 4,min_age = 20,max_age = 25会失败。我的(伪)代码,因此:
$age['min'] = $x;
$age['max'] = $y;
$current ranges = db_query('SELECT min_age, max_age FROM age_table')->fetchAll();
foreach ($age as $limit)
{
for ($i = 0; $i < count($current_ranges); $i++)
{
if ($limit >= $current_ranges[$i]->min_age && $limit <= $current_ranges[$i]->max_age) $conflict = $result[$i]->entity_id;
}
}
if ($conflict) fail();
但这是过于简单化的(不是吗?),因为它只是测试最小/最大值是否落在定义的范围内。我认为这个可能可以工作,但我会采用一些模糊的逻辑......任何人都可以帮助我加强这一点吗?干杯...
答案 0 :(得分:1)
我创建一个包含[min,max]范围内所有值的数组,然后与所有现有范围相交:
$new_range = range($min, $max);
foreach ($current_ranges as $range) {
if (count(array_intersect($new_range, range($range["min"], $range["max"])))) {
throw new RangeException();
}
}
这将在与新的一致的第一个已存在的范围上抛出异常。
答案 1 :(得分:1)
你只需使用下面的sql查询来实现这个就像
SELECT min_age, max_age FROM age_table WHERE min_age >= $min_age or max_age >= $max_age
如果您的数据库中不存在该范围,则此查询将返回其他任何内容,它将返回已过滤的行。