Parece que você deseja fazer uma interseção de matriz, exceto que sua matriz é uma única coluna. Isso pode ser feito, mas será lento, difícil de depurar e não aproveitará o poder dos bancos de dados relacionais. Uma maneira melhor seria alterar seu esquema de tabela para algo assim:
Grupos de tabelas
group_id int unsigned not null auto_increment primary key,
character_list text
membros da tabela_no_grupo
group_id int unsigned not null,
group_member varchar(45) not null
Então você pode consultar assim:
SELECT group_id, character_list
FROM groups g
JOIN members_in_groups m USING (group_id)
WHERE m.group_member IN ('Mr. T', ...);
Os
groups
table é provavelmente muito parecida com a sua tabela atual. Os members_in_groups
table são os mesmos dados divididos em partes facilmente pesquisáveis. ETA dado seu comentário, isso deve funcionar se você pode garantir que cada
character_list
contém apenas um instância de cada personagem:SELECT group_id,
SUM(CASE m.group_member IN ('Mr. T', 'Apollo', 'Rocky') THEN 1 ELSE 0 END) AS tally,
character_list
FROM groups g
JOIN members_in_groups m ON (g.group_id=m.group_id)
GROUP BY group_id
HAVING SUM(CASE m.group_member IN ('Mr. T', 'Apollo', 'Rocky') THEN 1 ELSE 0 END) = 3;
Neste caso, o
HAVING
cláusula deve ser igual a 3 porque existem 3 membros em IN ('Mr. T', 'Apollo', 'Rocky')
.