Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak porównać dwie listy ciągów oddzielone przecinkami za pomocą MySQL?

Wygląda na to, że chcesz wykonać przecięcie tablicy, z wyjątkiem tego, że twoja tablica jest pojedynczą kolumną. Można to zrobić, ale będzie to powolne, trudne do debugowania i nie będzie wykorzystywało mocy relacyjnych baz danych. Lepszym sposobem byłaby zmiana schematu tabeli na coś takiego:

Grupy tabel

group_id int unsigned not null auto_increment primary key,
character_list text

Tabela members_in_group

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

Następnie możesz zapytać w ten sposób:

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

groups stół jest prawdopodobnie bardzo podobny do twojego obecnego stołu. members_in_groups tabela to te same dane pocięte na łatwe do przeszukiwania części.

ETA biorąc pod uwagę Twój komentarz, to powinno działać jeśli możesz zagwarantować, że każdy character_list zawiera tylko jeden wystąpienie każdego 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;

W tym przypadku HAVING klauzula musi być równa 3, ponieważ w IN ('Mr. T', 'Apollo', 'Rocky') .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. gdzie jest błąd w moim kodzie sql?

  2. mysql:uzyskaj liczbę rekordów między dwiema datami i godzinami

  3. Właściwy sposób na uzyskanie nazwy użytkownika i hasła z ciągu połączenia?

  4. Gdzie MySQL przechowuje pliki bazy danych w systemie Windows i jakie są nazwy plików?

  5. MySQLi nie może przygotować oświadczenia