匹配数据库表中的任何字段集

时间:2012-08-06 10:23:25

标签: php mysql database cakephp

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

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

4个字段为first_namelast_namedobfather_name。我想找到那些与上面给出的4个字段中的任何3个匹配的记录。

sql查询要做什么?如果可能的话,我如何使用Models在CakePHP中完成它。 提前致谢。

3 个答案:

答案 0 :(得分: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 ,
        ),

)

答案 1 :(得分: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个。

答案 2 :(得分: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));