2015-09-04 72 views
1

搜索多個電話號碼的格式在MySQL數據庫表搜索一個電話號碼與具有不同格式通過PHP從MySQL

我有2 columns - phone and mobile.

兩個數據庫表中的電話號碼兩個或更多的電話字段列列具有不同格式的電話號碼,如:

+(91) 950-232-9020 
+91 950-232-9020 
+91 9502329020 
09502329020 

從我的PHP scriptm如果我要搜索電話號碼「9502329020」,
我希望它漚甕4行。

到目前爲止,我已經找到1解決方案使用%每個數字爲後:

Select * from table 
where phone like '%9%5%0%2%3%2%9%0%2%0' or 
mobile like '%9%5%0%2%3%2%9%0%2%0'; 

但是如果我不得不尋找數百萬行的,我需要一個優化的解決方案。

任何人都可以幫助我一個優化的解決方案,有點像在MYSQL查詢中使用正則表達式。

注意:保存在數據庫中時,電話號碼以用戶友好格式保存。

+0

http://stackoverflow.com/questions/9099469/mysql-select-like-or-regexp-to-match-multiple-單詞記錄 –

+0

@ShivaniA ggarwal如果你創建另一列並添加刪除任何特殊字符的電話號碼將會更好。 – Criesto

+0

您可以在www.sqlfiddle.com上放置您的表格和一些示例數據嗎? –

回答

0

我認爲你使用錯誤的方式(因爲你除了數百萬行)。無論你做什麼,你的瓶頸都會缺乏索引,否則你將無法使用索引。你應該正確地設計你的列,也 我發現你的要求'在數據庫中保存時,電話號碼將以用戶友好的格式保存。'荒誕。每個硬幣都有兩面,你不能只考慮一面而忽視另一面。在你的情況下,更容易保存和顯示數據,但幾乎不可能搜索相同的數據。

你將不得不找到一箇中間立場,它會指導你如何保存數據,但會使搜索更快。既然你已經有一個列(你用來存儲和顯示電話號碼),我會建議添加另一列'formattedphonenumbers'作爲varchar。它應該存儲相同的電話號碼,但格式可以用作索引。在此列中刪除所有不是數字的字符,然後將其撤消。

例如,如果電話號碼是+(91)950-232-9020,那麼在格式化列中它應該被存儲爲020923205919(反向),現在您將能夠正確使用索引。當搜索eg.950-232-9020或+(91)950-232-9020或0950-232-9020時,做同樣的事情去掉所有不是數字的字符將其顛倒並搜索爲 ,其中格式化數字如'020923205919%'if國家代碼沒有給出,那麼它也將能夠搜索。

+0

當使用這個我建議使用兩列與正常格式和一個與反向..或列顛倒沒有多大意義,如果你不使用或閱讀sql列的意見。 –

+0

@Ratna - 在不同國家代碼的情況下會產生問題。 –

+0

@Sivivani Aggarwal你能告訴我如何?你也可以嘗試不同的國家代碼。 – Ratna

0

正則表達式是您的朋友:

$number="9502329020"; 

$regexp = "(0|.*)?".substr($number,0,3)."-?".substr($number,3,3)."-?".substr($number,6,4); 

$subquery = "SELECT * FROM table WHERE phone REGEXP '$regexp' or mobile REGEXP '$regexp'"; 
+0

不符合上百萬條記錄.. –

+1

他們仍然是你的朋友。慢朋友。 – Amarnasan

+0

它是一個複雜的.. –

0

@Criesto:就實現爲:

創建**new table 'filtered_phonenumbers'**
有兩列 'recordid' 和 'phone_number'

這將有多個一個記錄的電話號碼,
保存後刪除所有特殊字符,如space,(,),+,-

例如,我有

recordid = '1' and 
phone = +(91) 950-232-9020 
mobile = 9502329020 

記錄等方面作了新的表「filtered_phonenumbers」
其中記錄被過濾的形式保存的兩個電話和移動兩個如下:

recordid | phone_number 
1   | 919502329020 
1   | 9502329020 

每當一個電話號碼是搜索,它可以在這個新表中搜索,然後記錄可以通過recordid操縱