2012-07-02 5 views
0

은행 명세서 (설명, 가치, 유형 등)를 구매자 (이름, 주소)와 일치시키는 온라인 시스템을 만들고 있으며 현재 수행중인 방식에 대한 의견을 듣고 싶습니다. 이 :MySQL 검색어로 상대적인 순서로 키워드 검색

$array = array("keywords", "taken", "from", 
       "bank", "statements", "using", "explode", 
       "function", "using", "a", "space"); 

$i = 0; 
$r = array(); //r = relevant 

while($i<count($array)) { 

    $keyword = $array[$i]; 

    $get = mysql_query("SELECT `id` FROM `users`, `addresses` 
         LEFT JOIN `users`.`id` = `addresses`.`user` 
         WHERE (`users`.`frame` LIKE '%$keyword%' 
         OR `users`.`lname` LIKE '%$keyword%') 
         OR ((`addresses`.`address` LIKE '%$keyword%' 
         OR `addresses`.`town` LIKE '%$keyword%') 
         OR (`addresses`.`county` LIKE '%$keyword%' 
         OR `postcode`.`town` LIKE '%$keyword%'));"); 

    if(mysql_num_rows($get)) { 
    while($fetch = mysql_fetch_array($get)) { 
     list($var) = $fetch; 
     push_array($r, $var); 
    } 
    } 

    $i++; 

} 

//count the IDs that match within the relative array to see 
//which is most relative to the search 

실행 시간을 절대 최소로 유지하는 것 외에 더 나은 방법이 있습니까? 완료되면 데이터베이스는 수천의 10s에있을 것입니다.

답변

1

사용자에게 각 키워드를 묶는 키워드 테이블, 예를 들어, 빌드하는 것이 더 나은 것 : 당신은 당신이 검색하고자하는 데이터에서 키워드 테이블을 채우는 후

keywords (keyword, user) + UNIQUE(keyword, user) 

keyword1 12 
keyword1 14 
keyword2 3 

는 쿼리가 훨씬 더된다 최적 :

SELECT users.* 
FROM keywords 
INNER JOIN users ON users.id = keywords.user 
WHERE keyword IN ('keyword1', 'keyword2') 

물론 사용자 또는 주소 테이블 (삽입, 업데이트, 삭제)을 변경할 때이 테이블을 유지해야합니다.