Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como comparar duas listas de strings separadas por vírgulas usando o MySQL


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') .