2010-11-19 8 views
1

나는 가져온 정보를 저장하는 데이터베이스 테이블을 가지고 있습니다. 단순화하기 위해, 같은 그 뭔가 :mysql 검색 쿼리

CREATE TABLE `data_import` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
`payee` VARCHAR(50) NULL DEFAULT NULL, 
PRIMARY KEY (`id`), 
INDEX `payee` (`payee`) 
) 

는 또한 수입 규칙을 저장하는 테이블이 :

CREATE TABLE `import_rules` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
`search` VARCHAR(50) NULL DEFAULT NULL, 
PRIMARY KEY (`id`), 
INDEX `search` (`search`) 
) 

아이디어는 가져온 각 트랜잭션에 대해 쿼리가 단일 일치하는 규칙을 찾을 시도 할 필요가 있다는 것입니다 -이 일치는 data_import.payee 및 import_rules.seach 필드에서 수행됩니다. 이 두 필드가 모두 varchar 필드이기 때문에 쿼리를 더 빠르게 만들려고 인덱스를 만들었습니다.

이것은 내가 지금까지 생각해 낸 것이므로 잘 작동하는 것 같습니다.

SELECT i.id, i.payee, i.amount, i.posted r.id, r.search 
FROM import_data id 
LEFT JOIN import_rules ir on i.payee = ir.search 

따라서, 예를 들어, 우리는 '코카콜라'의 import_rules.search 기록하고, '코카콜라'의 import_data.payee의 기록을 가지고 있다고 할 수 있습니다. 그럼 우리는 성냥을 얻는다.

이제 우리는 이것을 좀 더 유연하게 만들고 검색이 수취인의 일부와 일치하더라도 일치 항목을 얻을 수 있도록 할 수 있습니다. 따라서 import_rules.search = 'cola'및 import_data.payee = 'coca cola'는 계속 일치해야합니다.

다양한 "LIKE '% search %'"의 성능이 좋지 않습니다. 나는 innodb에서 실행 중이므로 myisam의 텍스트 검색 대안이 옵션인지 확실하지 않습니다. 필요한 경우 해당 테이블을 전환 할 수 있습니다.

+2

질문하고 싶은 질문이 있으십니까? –

+2

글쎄, 개인적으로, 나는 명성을 얻으려고 여기에있다. .. –

+0

미안하지만, 나는 분명히 그 말이 맞지 않았다. 전체 문자열이 아닌 (잠재적 인) 부분 일치에 대해 조인하고있는 경우 쿼리를 어떻게 구성합니까? 그리고 여전히 성능을 유지하십시오. – JonoB

답변

0

MATCH (field1) AGAINST(value)을 사용하여 데이터베이스에서 해당 단어를 검색 할 수 있습니다.