sql >> Databáze >  >> RDS >> Mysql

Jak porovnat dva seznamy řetězců oddělených čárkami pomocí MySQL

Zdá se, že chcete provést průnik pole, kromě toho, že vaše pole je jeden sloupec. Dá se to udělat, ale bude to pomalé, obtížně se to ladí a nebude to využívat sílu relačních databází. Lepším způsobem by bylo změnit schéma tabulky na něco takového:

Skupiny tabulek

group_id int unsigned not null auto_increment primary key,
character_list text

Tabulka members_in_group

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

Pak se můžete dotazovat takto:

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

groups tabulka je pravděpodobně velmi podobná vaší aktuální tabulce. members_in_groups tabulka je stejná data rozdělená na snadno prohledávatelné části.

ETA vzhledem k vašemu komentáři by to mělo fungovat pokud můžete zaručit, že každý character_list obsahuje pouze jeden instance každého znaku:

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;

V tomto případě HAVING klauzule se musí rovnat 3, protože v IN ('Mr. T', 'Apollo', 'Rocky') jsou 3 členové .



  1. Jak nastavit výchozí řádek pro dotaz, který nevrací žádné řádky?

  2. Jak získat velikost blob v PHP nebo SQL

  3. SQL dotaz vrací data z více tabulek

  4. Vizualizace dat