我正在使用CakePHP 2.1.3作爲我的應用程序。 我有以下條件匹配:匹配數據庫表中的任何字段集合
「查找與4個給定字段中的任何3個字段匹配的記錄。」
四個字段是first_name
,last_name
,dob
,father_name
。我想找到與上面給出的4個字段中的任何3個相匹配的記錄。
什麼是SQL查詢來做到這一點?如果可能的話,我如何使用模型在CakePHP中完成它。 在此先感謝。
我正在使用CakePHP 2.1.3作爲我的應用程序。 我有以下條件匹配:匹配數據庫表中的任何字段集合
「查找與4個給定字段中的任何3個字段匹配的記錄。」
四個字段是first_name
,last_name
,dob
,father_name
。我想找到與上面給出的4個字段中的任何3個相匹配的記錄。
什麼是SQL查詢來做到這一點?如果可能的話,我如何使用模型在CakePHP中完成它。 在此先感謝。
如果我沒有理解好你的問題,你的主要問題似乎是性能。爲了提高性能,你必須降低該解決方案使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個測試。
我不能把這種情況考慮在內。因爲它是非常敏感的數據,也是異質性的巨大可能性。 – 2012-08-06 12:14:28
uhm ...'dob'字段代表什麼? – 2012-08-06 12:17:43
出生日期?如果是這樣,你可以先測試dob。然後休息。它也會帶給你4n測試。 – 2012-08-06 12:18:58
$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));
1票向上。但我認爲你寫的語法存在一些問題。 – 2012-08-06 10:39:28
我認爲條件設置可能是:
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。但我以同樣的方式做了。我期待使用任何類型的常規expr的任何其他最佳解決方案。或切換案例,就像當前查詢花費10.2350秒從152053個用戶查找記錄一樣。謝謝 – 2012-08-06 10:43:14
你有沒有嘗試過任何事情..? – 2012-08-06 10:26:54
最簡單的方法是匹配數據庫中每個字段的組合。我正在嘗試尋找最佳解決方案。 – 2012-08-06 10:33:50
當它們爲空時,那些字段是否包含NULL? – Cups 2012-08-06 10:55:36