我在我的应用程序中使用CakePHP 2.1.3。 我有以下条件匹配:
“查找与4个给定字段中的任意3个字段匹配的记录。”
4个字段为first_name
,last_name
,dob
,father_name
。我想找到那些与上面给出的4个字段中的任何3个匹配的记录。
sql查询要做什么?如果可能的话,我如何使用Models在CakePHP中完成它。 提前致谢。
答案 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));