确保范围值与现有范围不重叠

时间:2011-12-09 20:30:20

标签: mysql php validation

我将一些范围信息存储在数据库中,如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();

但这是过于简单化的(不是吗?),因为它只是测试最小/最大值是否落在定义的范围内。我认为这个可能可以工作,但我会采用一些模糊的逻辑......任何人都可以帮助我加强这一点吗?干杯...

2 个答案:

答案 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

如果您的数据库中不存在该范围,则此查询将返回其他任何内容,它将返回已过滤的行。