2012-08-06 79 views
2

我正在使用CakePHP 2.1.3作爲我的應用程序。 我有以下條件匹配:匹配數據庫表中的任何字段集合

「查找與4個給定字段中的任何3個字段匹配的記錄。」

四個字段是first_namelast_namedobfather_name。我想找到與上面給出的4個字段中的任何3個相匹配的記錄。

什麼是SQL查詢來做到這一點?如果可能的話,我如何使用模型在CakePHP中完成它。 在此先感謝。

+0

你有沒有嘗試過任何事情..? – 2012-08-06 10:26:54

+0

最簡單的方法是匹配數據庫中每個字段的組合。我正在嘗試尋找最佳解決方案。 – 2012-08-06 10:33:50

+0

當它們爲空時,那些字段是否包含NULL? – Cups 2012-08-06 10:55:36

回答

3

如果我沒有理解好你的問題,你的主要問題似乎是性能。爲了提高性能,你必須降低該解決方案使12N測試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 , 
    ), 

    ) 

數量。

我建議你化妝的子查詢:

-the第一個採取任何匹配的四個字段的記錄

- 那麼你運行返回的結果

上面的查詢如果有名稱差異很大,這似乎是可信的,第一個查詢將刪除大部分數據,將您的查詢帶到多於4n個測試。

如果數據是高度同質化的(每個人都有同樣的名字),你可以看看1場,然後2,然後用另一種解決方案3.

編輯:

我想這DOB「代表出生日期。在15萬人當中,Dot將會均勻分佈似乎是合乎邏輯的。

所以我做了一個測試,看看是否Model.dot==value。然後我們有兩種可能性:

它返回true:我們要檢查的其他三個領域,看看是否至少2個適合

返回false:我們要檢查,如果剩下的三個正好契合。

第一個子集將會很小,因此它在性能方面並不重要。第二個將只需要每個記錄4個測試,而不是像之前一樣的12個測試。

+0

我不能把這種情況考慮在內。因爲它是非常敏感的數據,也是異質性的巨大可能性。 – 2012-08-06 12:14:28

+0

uhm ...'dob'字段代表什麼? – 2012-08-06 12:17:43

+0

出生日期?如果是這樣,你可以先測試dob。然後休息。它也會帶給你4n測試。 – 2012-08-06 12:18:58

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)); 
+0

1票向上。但我認爲你寫的語法存在一些問題。 – 2012-08-06 10:39:28

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 , 
     ), 

) 
+0

+1。但我以同樣的方式做了。我期待使用任何類型的常規expr的任何其他最佳解決方案。或切換案例,就像當前查詢花費10.2350秒從152053個用戶查找記錄一樣。謝謝 – 2012-08-06 10:43:14

相關問題