ワイルドカード(*)はデータに含まれ、クエリには含まれないため、データを細かく分割することから始める必要があると思います。次のような列を持つインデックステーブルを作成する必要があります。
dataGroup INT(11),
exactString varchar(100),
wildcardEnd varchar(100),
wildcardStart varchar(100),
「Folder1/Folder2」のような値がある場合は、それを「exactString」に格納し、メインデータテーブルの値のIDを上記のインデックステーブルの「dataGroup」に割り当てます。
「Folder1/*」のような値がある場合は、「Folder1 /」の値を「wildcardEnd」に保存し、メインテーブルの値のIDを上記の表の「dataGroup」フィールドに再度割り当てます。
次に、以下を使用してクエリ内で照合を行うことができます。
indexTable.wildcardEnd = LEFT('Folder1/WhatAmILookingFor/Data', LENGTH(indexTable.wildcardEnd))
これにより、検索文字列('Folder1 / WhatAmILookingFor / Data')が "Folder1 /"に切り捨てられ、wildcardEndフィールドと照合されます。mysqlは、すべての行を切り捨てるのではなく、最初の文字から始めて、すべての行と照合する(Bツリーインデックスを使用)のに十分賢いと思います。
「*/Folder4」のような値は「wildcardStart」フィールドに入りますが、逆になります。ミッシーエリオットを引用するには:「それは価値があります、私はそれを働かせてください私は私のものを置き、それを裏返し、そしてそれを逆にします」(http://www.youtube.com/watch?v=Ke1MoSkanS4)。したがって、「wildcardStart」に「4redloF/」の値を格納します。次に、次のようなWHEREが行に一致します。
indexTable.wildcardStart = LEFT(REVERSE('Folder1/WhatAmILookingFor/Folder4'), LENGTH(indexTable.wildcardStart))
もちろん、アプリケーションロジックですでに「REVERSE」を実行することもできます。
ここで、注意が必要な部分について説明します。「*/Fo * 4」のようなものは、2つのレコードに分割する必要があります。
# Record 1
dataGroup ==> id of "*/Fo*4" in data table
wildcardStart ==> oF/
wildcardEnd ==> /Fo
# Record 2
dataGroup ==> id of "*/Fo*4" in data table
wildcardStart ==> 4
ここで、何かを一致させる場合は、dataGroupのすべてのインデックスレコードが完全に一致するように返され、重複が発生しないように注意する必要があります。これはSQLでも解決できる可能性がありますが、この質問を超えています。