У меня есть таблица базы данных, в которой хранится импортированная информация. Для простоты это что-то вроде:
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 = 'кока-кола' все равно должны привести к совпадению.
Насколько я понимаю, различные "LIKE '% search%'" имеют плохую производительность. Я работаю на innodb, поэтому не уверен, что альтернативы текстового поиска от myisam вариант. Возможно, я смогу поменять эту таблицу, если потребуется.