2014-02-08 48 views
1

我與每一個財富1000強公司的名稱一個表:選擇行

FortuneList:

------------------------------------------------ 
|fid  | coname       | 
------------------------------------------------ 
| 1   | 3m        | 
| 2   | Amazon       | 
| 3   | Bank of America     | 
| 999  | Xerox       | 
------------------------------------------------ 

我有第二個表與我的通訊每一位用戶:
MyUsers:

------------------------------------------------ 
|uid | name  | companyname    | 
------------------------------------------------ 
| 1350 | John Smith | my own Co    | 
| 2731 | Greg Jones | Amazon.com, Inc  | 
| 3899 | Mike Mars | Bank of America, Inc | 
| 6493 | Alex Smith | Handyman America  | 
------------------------------------------------ 

我如何拔出我的通訊的訂戶中的每一個,對於一個福爾頓工作e 1000公司? (通過掃描我的整個MyUsers表中有任何coname的從FortuneList表中的每個記錄)

我想輸出拉:

------------------------------------------------ 
|uid | name  | companyname    | 
------------------------------------------------ 
| 2731 | Greg Jones | Amazon.com, Inc  | 
| 3899 | Mike Mars | Bank of America, Inc | 
------------------------------------------------ 

(看看它是如何發現「亞馬遜」在中間「Amazon.com,公司」)的

+0

這似乎適用於幾個搜索條件。但我有999,所以我需要一個動態查詢: SELECT m。* FROM'myusers' m WHERE MATCH('companyname') AGAINST('Amazon'IN BOOLEAN MODE) 我需要使'反對'部分包括來自FortuneList的全部1000個名字 –

+0

該解決方案不會使用'MATCH ... AGAINST'嗎?或者它*有*使用全文索引? – hichris123

+0

@ hichris123我會採取任何答案,幫助我解決問題。我只使用了MATCH ...反對,因爲這與我的網絡研究最接近。我原本打算寫一個帶有一堆循環和東西的PHP腳本,但認爲如果我可以在mySQL中完成,它會更容易。 –

回答

1

嘗試使用此,它使用一個INNER JOIN,所述LIKE操作者,和CONCAT

SELECT * 
FROM MyUsers 
INNER JOIN FortuneList 
    ON FortuneList.coname LIKE CONCAT('%', MyUsers.companyname, '%) 

(這不會使用全文索引,我試圖找出你如何能在一個JOIN使用MATCH...AGAINST

+0

星期一我會試試這個。我希望它能起作用。 :)我不必有一個匹配...反對。 :)我甚至不介意是否需要很長時間來處理。這不是一個網頁腳本或任何東西。我只是想分析我的數據庫。謝謝! –

0

使用本地(因此沒有索引):

select uid, name, companyname 
from MyUsers JOIN FortuneList 
WHERE LOCATE(coname, companyname) > 0 
1

如果您是在Oracle中這樣做,這會產生你想要的結果(與示例數據):

with fortunelist as(
     select 1 as fid, '3m' as coname from dual union all 
     select 2, 'Amazon' from dual union all 
     select 3, 'Bank of America' from dual union all 
     select 999, 'Xerox' from dual 
     ) 
     , myusers as(
     select 1350 as usrid, 'John Smith' as name, 'my own Co' as companyname from dual union all 
     select 2731, 'Greg Jones', 'Amazon.com, Inc.' from dual union all 
     select 3899, 'Mike Mars', 'Bank of America, Inc' from dual union all 
     select 6493, 'Alex Smith', 'Handyman America' from dual 
     ) 
select utl_match.jaro_winkler_similarity(myusers.companyname, fortunelist.coname) as sim 
     , myusers.companyname 
     , fortunelist.coname 
from fortunelist 
     , myusers 
where utl_match.jaro_winkler_similarity(myusers.companyname, fortunelist.coname) >= 80 

其原因是,在哈羅溫克勒結果爲2你是87和95(亞馬遜和BOA之後, 分別)。您可以在查詢中向上或向下碰撞80,以使匹配閾值更高或更低。你走得越高,你會得到的比賽越少,但他們會更有可能。你越低,你會得到更多的比賽,但你有可能會得到不匹配的比賽。例如,「勤雜工美國」與「美國銀行」= 73/100。所以如果你把它降到70,你會得到一個誤報,使用你的示例數據。 Jaro Winkler通常用於人名,而不是公司名稱,但是因爲公司名稱通常也是非常短的字符串,所以它可能對您仍然有用。

我知道你這個標記作爲MySQL的,雖然這功能不存在,從我讀過的人已經做過的工作創建一個自定義功能: http://androidaddicted.wordpress.com/2010/06/01/jaro-winkler-sql-code/ http://dannykopping.com/blog/fuzzy-text-search-mysql-jaro-winkler

你也試試字符串替換,例如。消除找不到匹配的常見原因(比如在一張桌子上有一個「公司」,而不是在另一張桌子上)。

編輯14年2月10日:

你可以在MySQL(通過phpMyAdmin的)以下步驟執行此操作:

  1. 走進phpmyadmin的那麼你的數據庫和代碼從這個URL粘貼鏈接(下面)到一個SQL窗口並點擊Go。這將創建您需要在步驟2中使用的自定義功能。我不打算在這裏粘貼這個函數的代碼,因爲它很長,也不是我的工作。它基本上允許您在MySQL中使用jaro winkler算法,如果您使用的是Oracle,則與使用utl_match相同。 http://androidaddicted.wordpress.com/2010/06/01/jaro-winkler-sql-code/

  2. 被創建功能後,運行下面的SQL:

-

select jaro_winkler_similarity(myusers.companyname, fortunelist.coname) as similarity 
     , myusers.uid 
     , myusers.name 
     , myusers.companyname as user_co 
     , fortunelist.coname as matching_co 
from fortunelist 
     , myusers 
where jaro_winkler_similarity(myusers.companyname, fortunelist.coname) >= 80 

這應該得到你正在尋找確切的結果,但就像我說你我們希望能夠利用該SQL中的80來進行升級或降級,以便在避免誤報並找到想要找到的匹配之間保持良好的平衡。

我沒有一個MySQL數據庫用於測試,所以如果遇到問題請讓我知道,但這應該工作。

+0

謝謝ShWiVel。我不知道甲骨文,我也​​不是那麼先進。抱歉。 –

+0

即使你不使用Oracle,有人已經爲MySQL創建了一個自定義函數(你可以通過phpmyadmin使用MySQL)。我將在一秒內編輯我的帖子,但是我給出的第一個鏈接具有您要創建的功能,之後您可以使用該功能,其語法與Oracle非常相似(並具有相同的功能)。 –

+0

另一方面,我不知道你的表有多大,但是如果該查詢需要一段時間才能運行,您還可以在兩個表之間加入公司名稱的第一個字符(並且保留查詢,否則保持不變),這樣你就可以過濾那些從同一個字母開始的公司,並且只依靠該功能來確定2個公司之間的相似性,以滿足每個公司的條件。 –