2010-11-19 3 views
1

J'ai une table de base de données qui stocke des informations importées. Par souci de simplicité, ses quelque chose comme:requête de recherche 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`) 
) 

J'ai aussi une table qui stocke les règles d'importation:

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

L'idée est que pour chaque transaction importée, la requête doit essayer trouver une seule règle de correspondance - cette correspondance est effectuée sur les champs data_import.payee et import_rules.seach. Parce que ce sont les deux champs varchar, je les ai indexés dans l'espoir de rendre la requête plus rapide.

C'est ce que j'ai trouvé jusqu'à présent, qui semble fonctionner correctement.

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 

Ainsi, par exemple, permet de dire que nous avons un record import_rules.search de 'coca cola', et un record import_data.payee de 'coca-cola'. Ensuite, nous obtenons un match. Maintenant, disons que nous voulons rendre cela un peu plus flexible et que même si la recherche correspond à une partie du bénéficiaire, nous obtenons une correspondance. Ainsi, import_rules.search = 'cola' et import_data.payee = 'coca-cola' devraient toujours aboutir à une correspondance. D'après ce que je comprends, les diverses "LIKE '% search%'" ont de mauvaises performances. Je cours sur innodb, donc je ne sais pas si les alternatives de recherche de texte de myisam sont une option. Je pourrais être en mesure de changer cette table si nécessaire.

+2

Avez-vous posé une question que vous vouliez poser? –

+2

Eh bien, personnellement, je suis ici pour la réputation .. –

+0

Désolé, je n'ai évidemment pas dire ce droit. Comment puis-je construire la requête étant donné que je me joins maintenant à une correspondance partielle (potentielle) plutôt qu'à la chaîne complète. Et toujours maintenir la performance. – JonoB

Répondre

0

pour ce cas, vous pouvez utiliser MATCH (field1) AGAINST(value) pour rechercher les mots perticular de la base de données.

Questions connexes