Mysql
 sql >> Database >  >> RDS >> Mysql

Come confrontare due elenchi di stringhe separate da virgole utilizzando MySQL

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