Sembra che tu voglia fare un'intersezione di array, tranne per il fatto che il tuo array è una singola colonna. Può essere fatto, ma sarà lento, difficile da eseguire il debug e non sfrutterà la potenza dei database relazionali. Un modo migliore sarebbe cambiare lo schema della tabella in qualcosa del genere:
Gruppi di tabelle
group_id int unsigned not null auto_increment primary key,
character_list text
Membri della tabella_in_gruppo
group_id int unsigned not null,
group_member varchar(45) not null
Quindi puoi interrogare in questo modo:
SELECT group_id, character_list
FROM groups g
JOIN members_in_groups m USING (group_id)
WHERE m.group_member IN ('Mr. T', ...);
I groups
table è probabilmente molto simile alla tua tabella attuale. I members_in_groups
table sono gli stessi dati suddivisi in parti facilmente ricercabili.
ETA dato il tuo commento, questo dovrebbe funzionare se puoi garantire che ogni character_list
ne contiene solo uno istanza di ogni carattere:
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;
In questo caso il HAVING
la clausola deve essere uguale a 3 perché ci sono 3 membri in IN ('Mr. T', 'Apollo', 'Rocky')
.