2

アプリケーションに CakePHP 2.1.3 を使用しています。一致する次の条件があります。

「指定された 4 つのフィールドから任意の 3 つのフィールドに一致するレコードを検索します。」

4 つのフィールドはfirst_namelast_namedobfather_nameです。上記の 4 つのフィールドのいずれかに一致するレコードを検索したいと考えています。

それを行うための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 テストを行います。

サブクエリを作成することをお勧めします。

- 4 つのフィールドのいずれかに一致するレコードを取得する最初のもの

-次に、返された結果に対して上記のクエリを実行します

名前に大きなばらつきがある場合は、信頼できると思われますが、最初のクエリでデータの多くが削除され、クエリは 4n を少し超えるテストになります。

データが非常に均一である (全員が同じ名前である) 場合は、1 つのフィールド、次に 2、次に 3 を探すことができます。

別の解決策で編集:

「dob」は生年月日を表していると思います。150000 人の間で Dot が均等に配布されることは論理的に思えます。

そこで、 かどうかをテストしますModel.dot==value。次に、2 つの可能性があります。

true を返します。他の 3 つのフィールドをチェックして、少なくとも 2 つのフィールドが適合するかどうかを確認する必要があります。

false を返します: 残りの 3 つが正確​​に適合するかどうかを確認する必要があります。

最初のサブセットは小さいため、パフォーマンスに関しては問題になりません。2 つ目は、以前のように 12 のテストではなく、レコードごとに 4 つのテストのみが必要です。

于 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 に答える