2011-02-01 2 views
0

표가 FUll TEXT SEARCH와 함께 두 개의 열 namesdetails를 가지고는 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 

을 활성화

첫 번째 단계 :

는 각각의 이름과 details을 읽을 table1

두 번째 단계 다음 표에서

검색 각각 detailsnames

,

세 번째 단계 :

캡처 names

네 번째 단계의 검색 결과 :

첫 번째 단계에서 이름을 표 2에 저장을하고 세 번째 단계에서 names을 붙 잡았다.

는 fianlly 내가 MySQL과 PHP에서이 작업을 수행 할 수있는 방법

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

과 같이 표 2 ?? 나는 최대 250k까지 이것을하고 싶다.

+1

일반적인 다 대다 관계 구현 대신 쉼표 값과 결합하여 사용하는 것은 항상 바람직하지 않습니다. – zerkms

+0

이름을 반복하고 세부 사항을 얻는 방법을 알고 있지만 세부 사항으로 검색하는 방법을 알고 있습니까? 아 나는 혼란 스럽습니다. – leon

+0

잘 수행 할 수있는 방법은 무엇입니까 ?? 나는 초보자이며 MySQl의 기본 지식 만 알고 있습니다. – leon

답변

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 

순서에 따라 엄격하게 필요하지 않습니다,하지만 당신은 콘솔이 실행 경우는 쉽게 결과를 검사 할 수 있습니다 : 그렇다면, 쿼리입니다.

이러한 모든 CASE ... WHEN 문은 중복 된 쌍의 문제를 제거합니다. 그들 없이는 질의가 모든 응답을 두 배로 늘릴 것이고, "joe, bill"과 "bill, joe"그리고 "suzy, john"그리고 "john, suzy"를 얻게 될 것입니다. 그 CASE..WHEN들은 알파벳순으로 낮은 이름을 먼저 가지고 있기 때문에 붕괴되고 사기가 제거 될 수 있습니다.

그런 다음 Common Table Expression을 사용하여 서버에서 이들을 결합하거나 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); 
} 
?> 

마지막주의 사항. 그 세부 사항 목록을 먼저 정규화하지 않고이 작업을 시도하려고 생각하고 싶지 않습니다. (

관련 문제