Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment comparer deux listes de chaînes séparées par des virgules à l'aide de MySQL

Il semble que vous vouliez faire une intersection de tableau, sauf que votre tableau est une seule colonne. Cela peut être fait, mais ce sera lent, difficile à déboguer et n'exploitera pas la puissance des bases de données relationnelles. Une meilleure façon serait de changer le schéma de votre table en quelque chose comme ceci :

Groupes de tableaux

group_id int unsigned not null auto_increment primary key,
character_list text

Tableau members_in_group

group_id int unsigned not null,
group_member varchar(45) not null

Ensuite, vous pouvez interroger comme ceci :

SELECT group_id, character_list
FROM groups g 
  JOIN members_in_groups m USING (group_id)
WHERE m.group_member IN ('Mr. T', ...);

Les groups table ressemble probablement beaucoup à votre table actuelle. Les members_in_groups table est la même donnée découpée en parties facilement consultables.

ETA compte tenu de votre commentaire, cela devrait fonctionner si vous pouvez garantir que chaque character_list n'en contient qu'un instance de chaque caractère :

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;

Dans ce cas, le HAVING la clause doit être égale à 3 car il y a 3 membres dans IN ('Mr. T', 'Apollo', 'Rocky') .