Có vẻ như bạn muốn thực hiện một giao giữa mảng, ngoại trừ mảng của bạn là một cột duy nhất. Nó có thể được thực hiện, nhưng nó sẽ chậm, khó gỡ lỗi và sẽ không tận dụng được sức mạnh của cơ sở dữ liệu quan hệ. Một cách tốt hơn là thay đổi lược đồ bảng của bạn thành một cái gì đó như sau:
Nhóm bảng
group_id int unsigned not null auto_increment primary key,
character_list text
Table member_in_group
group_id int unsigned not null,
group_member varchar(45) not null
Sau đó, bạn có thể truy vấn như sau:
SELECT group_id, character_list
FROM groups g
JOIN members_in_groups m USING (group_id)
WHERE m.group_member IN ('Mr. T', ...);
Các nhóm groups
bảng có lẽ rất giống bảng hiện tại của bạn. members_in_groups
bảng là cùng một dữ liệu được chia nhỏ thành các phần có thể tìm kiếm dễ dàng.
ETA đã đưa ra nhận xét của bạn, điều này sẽ hoạt động nếu bạn có thể đảm bảo rằng mỗi character_list
chỉ chứa một phiên bản của mỗi ký tự:
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;
Trong trường hợp này, HAVING
mệnh đề phải bằng 3 vì có 3 thành viên trong IN ('Mr. T', 'Apollo', 'Rocky')
.