2010-11-19 22 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)をデータベースから検索することができます。