Divisez les listes en éléments individuels et travaillez à ce niveau.
Quelques tables:
listes
- ID séquence (PK)
- (les entrées "ABCD" ci-dessus)
- [tout ce]
des articles
- ID (PK)
- nom (valeur, mot, tout ce qui est logique)
- [quel que soit d'autre]
list_items
- LIST_ID
- ITEM_ID
- [un ordinal int, si "GHBA" et "ABGH" sont considérés comme des séquences différentes]
(composite PK LIST_ID, ITEM_ID [, ordinal] sur celui-là, beaucoup de base: nombre lien de parenté)
Certaines données, il est donc plus clair que les tableaux représentent:
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);
Et enfin, trouver des listes qui contiennent tous articles (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'
qui devrait renvoyer les listes comme "ABGH", "GHAB", "HATBAG", etc, mais pas « BUGHU- T "(non A) ou" B-A-T-H "(non G) - toutes les conditions doivent être remplies. Faire une "n'importe quelle" recherche pourrait être un peu plus impliqué (écrire ceci dans ma tête au cours du déjeuner, mais RIGHT JOIN
seul entraînerait probablement toutes sortes de doublons & lenteur).
Il ne mappera aucun génome ou ne redéfinira pas le langage humain, mais devrait être acceptable pour un ensemble de données de taille décente. De toute façon, j'éviterais de stocker chaque liste comme un varchar et de faire des choses "WHERE sequence LIKE '%A%' AND sequence LIKE '%B%'
" sauf si vous ne pouvez absolument pas gérer le travail supplémentaire pour ajouter de nouvelles données.
Je peux avoir un grand nombre d'éléments dans la liste. Les JOINs seraient trop chers. – gilbertc
@gilbertc - propbably moins cher que les analyses de table complètes qui seraient nécessaires sinon – Mark