Tốt hơn hết để chuẩn hóa lược đồ của bạn không lưu trữ các quan hệ dưới dạng danh sách được phân tách bằng dấu phẩy thay vào đó hãy tạo một bảng nối để duy trì m:m nhiều mối quan hệ giữa người dùng và bộ lọc, hãy tạo một bảng mới dưới dạng user_filters
với id bộ lọc cột và id người dùng và trong mỗi hàng lưu một liên kết cho mỗi người dùng và lọc giống như trong quan hệ giản đồ hiện tại của bạn cho bộ lọc 1 với nhiều người dùng (1, '1, 2, 3')
sẽ trở nên giống như
filter id user id
(1, '1'),
(1, '2'),
(1, '3'),
Lược đồ mẫu sẽ như thế này
CREATE TABLE user_filters
(`fid` int, `u_id` varchar(50))
;
INSERT INTO user_filters
(`fid`, `u_id`)
VALUES
(1, '1'),
(1, '2'),
(1, '3'),
(2, '5'),
(2, '5')
;
CREATE TABLE filters
(`id` int, `title` varchar(50))
;
INSERT INTO filters
(`id`, `title`)
VALUES
(1, 'test'),
(2, 'test 1')
;
CREATE TABLE users
(`id` int, `name` varchar(6))
;
INSERT INTO users
(`id`, `name`)
VALUES
(1, 'Tom'),
(2, 'Tim'),
(3, 'Sue'),
(4, 'Bruce'),
(5, 'Ann'),
(6, 'George')
;
Đối với lược đồ trên, bạn có thể dễ dàng truy vấn với tham gia như, truy vấn dưới đây có thể được tối ưu hóa bằng cách sử dụng các chỉ mục
select u.*
from users u
join user_filters uf on(uf.u_id = u.id)
where uf.fid =1
Bản trình diễn mẫu
Nếu bạn không thể thay đổi lược đồ của mình và muốn tiếp tục với lược đồ hiện tại, bạn có thể truy vấn như bên dưới nhưng lược đồ này không thể đủ tối ưu hóa so với truy vấn ở trên
select u.*
from users u
join filters f on(find_in_set(u.id,replace(`u_ids`,' ','')) > 0)
where f.id =1