我正在为我的应用程序使用 CakePHP 2.1.3。我有以下条件要匹配:
“从 4 个给定字段中查找与任意 3 个字段匹配的记录。”
4 个字段是first_name
, last_name
, dob
, father_name
。我想找到与以上给定 4 个字段中的任何 3 个匹配的那些记录。
执行此操作的 sql 查询是什么?如果可能的话,我如何使用模型在 CakePHP 中做到这一点。提前致谢。
我认为条件集可能是:
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 ,
),
)
如果我理解你的问题,你的主要问题似乎是性能。为了提高性能,您必须减少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 次。
$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));