Разделете списъците на отделни елементи и работете на това ниво.
Някои таблици:
списъци
- ID (PK)
- последователност (записите "A-B-C-D" по-горе)
- [каквото и да е друго]
елементи
- ID (PK)
- име (стойност, дума, каквото има смисъл)
- [каквото и да е друго]
списък_елементи
- list_ID
- item_ID
- [порядък int, ако "G-H-B-A" и "A-B-G-H" се считат за различни последователности]
(композитен 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'
Това трябва да върне всички списъци като "A-B-G-H", "G-H-A-B", "H-A-T-B-A-G" и т.н., но не и "B-U-G-H-U-T" (без A) или "B-A-T-H" (без G) - всички условия трябва да бъдат изпълнени. Извършването на „всяко“ търсене може да е малко по-ангажиращо (да пиша това в главата си по време на обяд, но само RIGHT JOIN
вероятно ще доведе до всякакви дублирания и бавност).
Той няма да картографира никакви геноми или да предефинира човешкия език, но трябва да е добре за набор от данни с приличен размер. Така или иначе, бих избегнал да съхранявам всеки списък като varchar и да правя "WHERE sequence LIKE '%A%' AND sequence LIKE '%B%'
" неща, освен ако абсолютно не можете да се справите с допълнителната работа за добавяне на нови данни.
person
tadamson
schedule
09.02.2010