2

我正在为我的应用程序使用 CakePHP 2.1.3。我有以下条件要匹配:

“从 4 个给定字段中查找与任意 3 个字段匹配的记录。”

4 个字段是first_name, last_name, dob, father_name。我想找到与以上给定 4 个字段中的任何 3 个匹配的那些记录。

执行此操作的 sql 查询是什么?如果可能的话,我如何使用模型在 CakePHP 中做到这一点。提前致谢。

4

3 回答 3

3

我认为条件集可能是:

    array('OR'=>array(
        array( "AND" => array (
            "Model.first_name" =>$val1 ,
            "Model.last_name" =>$val2 ,
            "Model.DOB" =>$val3 ,
        ),
        array( "AND" => array (
            "Model.last_name" =>$val2 ,
            "Model.DOB" =>$val3 ,
            "Model.father_name" =>$val4 ,
        ),
        array( "AND" => array (
            "Model.DOB" =>$val3 ,
            "Model.father_name" =>$val4 ,
            "Model.first_name" =>$val1 ,
        ),
        array( "AND" => array (
            "Model.father_name" =>$val4 ,
            "Model.first_name" =>$val1 ,
            "Model.last_name" =>$val2 ,
        ),

)
于 2012-08-06T10:39:23.517 回答
3

如果我理解你的问题,你的主要问题似乎是性能。为了提高性能,您必须减少if(value1==value2)

   array('OR'=>array(
    array( "AND" => array (
        "Model.first_name" =>$val1 ,
        "Model.last_name" =>$val2 ,
        "Model.DOB" =>$val3 ,
    ),
    array( "AND" => array (
        "Model.last_name" =>$val2 ,
        "Model.DOB" =>$val3 ,
        "Model.father_name" =>$val4 ,
    ),
    array( "AND" => array (
        "Model.DOB" =>$val3 ,
        "Model.father_name" =>$val4 ,
        "Model.first_name" =>$val1 ,
    ),
    array( "AND" => array (
        "Model.father_name" =>$val4 ,
        "Model.first_name" =>$val1 ,
        "Model.last_name" =>$val2 ,
    ),

   )

该解决方案进行 12n 次测试。

我建议你做一个子查询:

- 第一个获取与四个字段中的任何一个匹配的记录

- 然后对返回的结果运行上述查询

如果名称有很大的可变性,这似乎是可信的,那么第一个查询将删除大部分数据,使您的查询进行 4n 次多一点的测试。

如果数据是高度同质的(每个人都有相同的名字),您可以查找 1 个字段,然后是 2,然后是 3。

使用另一种解决方案进行编辑:

我想“dob”代表出生日期。在 150000 人中,Dot 将均匀分布,这似乎是合乎逻辑的。

所以我做一个测试看看是否Model.dot==value。那么我们有两种可能:

它返回 true:我们必须检查其他三个字段,看看是否至少有 2 个适合

它返回 false:我们必须检查其余三个是否完全匹配。

第一个子集会很小,因此在性能方面并不重要。第二个将只需要每条记录进行 4 次测试,而不是之前的 12 次。

于 2012-08-06T12:10:23.110 回答
1
$conditions = array('OR'=>array($your_input=>array('first_name', 'last_name', 'dob'),
                                    $your_input=>array('first_name', 'last_name', 'father_name'),
                                    $your_input=>array( 'last_name', 'dob', 'father_name'),
                                    ));
    $result = $this->Model->find('All',array('fields'=>'required_field','conditions'=>$conditions));
于 2012-08-06T10:37:50.070 回答