Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách so sánh hai danh sách chuỗi được phân tách bằng dấu phẩy bằng MySQL

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP mất nhiều thời gian hơn 90 lần để chạy truy vấn so với máy khách MySQL

  2. Trường cột 'duy nhất' có ngụ ý chỉ mục với MySQL không và nếu có thì tại sao?

  3. Base64 làm phương pháp khử trùng đầu vào của người dùng cho Mysql

  4. Các tab động đang hiển thị các bản ghi giống nhau

  5. Không thể thêm hoặc cập nhật hàng con:ràng buộc khóa ngoại không thành công