リストを個々のアイテムに分割し、そのレベルで作業します。
いくつかのテーブル:
リスト
- ID(PK)
- シーケンス(上記の「ABCD」エントリ)
- [ことなど]
アイテム
- ID(PK)
- 名前(値、単語、意味のあるものは何でも)
- [ことなど]
list_items
- list_ID
- item_ID
- [「GHBA」と「ABGH」が異なるシーケンスと見なされる場合の序数int]
(その1つにPK list_ID、item_ID [、序数]を合成し、基本的に多く:多くの関係)
一部のデータなので、表が何を表しているかがより明確になります。
INSERT INTO items (ID, name) VALUES (1, 'A'), (2, 'B'), (3, 'G'), (4, 'H');
INSERT INTO lists (ID, sequence) VALUES (1, 'A-B-G-H');
INSERT INTO list_items (list_ID, item_ID) VALUES (1, 1), (1, 2), (1, 3), (1, 4);
INSERT INTO lists (ID, sequence) VALUES (2, 'B-A-G');
INSERT INTO list_items (list_ID, item_ID) VALUES (2, 2), (2, 1), (2, 3);
そして最後に、すべてのアイテム(A、B、G、H)を含むリストを見つけるには:
SELECT lists.sequence FROM lists
JOIN list_items ON lists.ID = list_items.list_ID
JOIN items AS i1 ON list_items.item_ID = i1.ID HAVING i1.name = 'A'
JOIN items AS i2 ON list_items.item_ID = i2.ID HAVING i2.name = 'B'
JOIN items AS i3 ON list_items.item_ID = i3.ID HAVING i3.name = 'G'
JOIN items AS i4 ON list_items.item_ID = i4.ID HAVING i4.name = 'H'
これにより、「ABGH」、「GHAB」、「HATBAG」などのリストが返されますが、「BUGHUT」(Aなし)または「BATH」(Gなし)は返されません。すべての条件が満たされている必要があります。「任意の」検索を実行することは、もう少し複雑になる可能性があります(昼食時に頭の中でこれを書くと、RIGHT JOIN
おそらくすべての種類の重複と速度低下が発生します)。
ゲノムをマッピングしたり、人間の言語を再定義したりすることはありませんが、適切なサイズのデータセットでは問題ないはずです。WHERE sequence LIKE '%A%' AND sequence LIKE '%B%'
いずれにせよ、新しいデータを追加するための余分な作業を絶対に処理できない場合を除いて、各リストをvarcharとして保存したり「」を実行したりすることは避けたいと思います。