あなたの質問をよく理解していれば、あなたの主な問題はパフォーマンスにあるようです。パフォーマンスを向上させるには、数を減らす必要があります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 テストを行います。
サブクエリを作成することをお勧めします。
- 4 つのフィールドのいずれかに一致するレコードを取得する最初のもの
-次に、返された結果に対して上記のクエリを実行します
名前に大きなばらつきがある場合は、信頼できると思われますが、最初のクエリでデータの多くが削除され、クエリは 4n を少し超えるテストになります。
データが非常に均一である (全員が同じ名前である) 場合は、1 つのフィールド、次に 2、次に 3 を探すことができます。
別の解決策で編集:
「dob」は生年月日を表していると思います。150000 人の間で Dot が均等に配布されることは論理的に思えます。
そこで、 かどうかをテストしますModel.dot==value
。次に、2 つの可能性があります。
true を返します。他の 3 つのフィールドをチェックして、少なくとも 2 つのフィールドが適合するかどうかを確認する必要があります。
false を返します: 残りの 3 つが正確に適合するかどうかを確認する必要があります。
最初のサブセットは小さいため、パフォーマンスに関しては問題になりません。2 つ目は、以前のように 12 のテストではなく、レコードごとに 4 つのテストのみが必要です。