2011-02-01 21 views
0

表1取得了兩列namesdetailsFUll TEXT SEARCH啓用使用PHP讀取,搜索,捕獲,存儲在MySQl中?

names | details 
---------------------------- 
Mathew | car,home,insurance,job 
levin | home,business,shop 
john | car,home,insurance 
abin | home,insurance,job 
neil | shop,car,home,tax 
yancy | computer,consultant,engineer 

第一步:

在讀取每個名稱及其detailstable1

第二步:

在表1搜尋與detailsnames

第三步:

捕獲names

第四步的搜索結果:

存儲成表2與名稱在第一步和第三步捕獲names

fianlly表2的樣子

name | names 
----------------------- 
Mathew | john,abin,neil 

我怎樣才能做到這一點在PHP與MySQL?我想要做到這一點高達約250k。

+1

與逗號值結合使用而不是一般的多對多關係實現總是一個糟糕的主意 – zerkms 2011-02-01 03:06:47

回答

0

您是否可以將這些細節分解到子表中?因爲如果你可以的話,那麼它是微不足道的。

假設他們已經發生了,你必須:

name detail 
------------- 
john car 
john insurance 
neil car 
neil home 
...etc... 

所需輸出更容易比你逐步解釋閱讀,它看起來像你想,對於任何給定的人,所有的至少有一個共同點的其他人,不是嗎?如果是這樣,查詢:

-- the strange CASE WHEN eliminates transitive closure 
-- where you will get john,bill and bill,john 
select case when t1.name < t2.name then t1.name else t2.name end as name1 
    , case when t1.name < t2.name then t2.name else t1.name end as name2 
    from childTable t1 
    join childtable t2 on t1.detail = t2.detail 
        and t1.name <>t2.name 
group by case when t1.name < t2.name then t1.name else t2.name end 
     , case when t1.name < t2.name then t2.name else t1.name end 
order by case when t1.name < t2.name then t1.name else t2.name end 
     , case when t1.name < t2.name then t2.name else t1.name end 

的ORDER BY不是絕對必要的,但如果你在一個控制檯上運行這一點,使得它更容易檢查結果。

所有這些CASE ... WHEN語句消除了重複對的問題。如果沒有他們,查詢會使每一個答案翻倍,你會得到「喬,賬單」和「賬單,喬」和「舒茲,約翰」和「約翰,舒茲」。那些CASE..WHENs會讓他們總是按字母順序排名第一的名字,這樣他們就可以被摺疊起來,並消除欺騙。

之後,您可以使用公用表表達式在服務器上組合這些表達式,或者在PHP中循環訪問它們。 PHP可能看起來像這樣:

<?php 
# Assuming rows have been retrieved... 
$matches = array(); 
foreach($rows as $row) { 
    $matches[$row['name1']][] = $row['name2']; 
} 
foreach($matches as $name1=>$names) { 
    echo "$name1 has details in common with ".implode(",",$names); 
} 
?> 

最後一個註釋。我不想考慮在沒有首先對這些細節進行歸一化的情況下嘗試這樣做:(

相關問題