【问题标题】:Make sure range value doesn't overlap with existing ranges确保范围值不与现有范围重叠
【发布时间】:2011-12-09 20:30:19
【问题描述】:

我有一些范围信息作为 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();

但这过于简单化了(不是吗?),因为它只是测试最小值/最大值是否在定义的范围内。我认为这可能有效,但我使用了一些模糊的逻辑......谁能帮助我提高这一点?干杯...

【问题讨论】:

  • 更适合stackoverflow。
  • 能不能留个空隙? id=4 可以是 25-30 吗?

标签: mysql php validation


【解决方案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();
  }
}

这将在与新范围一致的第一个已存在范围上引发异常。

【讨论】:

    【解决方案2】:

    你可以简单地使用下面的 sql 查询来实现这个

    SELECT min_age, max_age FROM age_table WHERE min_age >= $min_age or max_age >= $max_age
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 2013-01-18
      • 2011-06-10
      • 2020-08-26
      • 2018-05-02
      • 1970-01-01
      相关资源
      最近更新 更多