Bạn thực sự nên xem xét Chuẩn hóa cơ sở dữ liệu
và đầu tiên chuẩn hóa cấu trúc của bạn bằng cách thêm một bảng nối và giữ một quan hệ từ tablec mỗi quan hệ được lưu trữ trong tablec sẽ được lưu trữ trong bảng nối mới nhưng không phải là danh sách được phân tách bằng dấu phẩy, mỗi hàng sẽ giữ id của c và một id người dùng trên mỗi hàng, nếu bạn không thể thay đổi giản đồ của bạn, bạn có thể sử dụng find_in_set
để tìm các giá trị trong tập hợp
select *
from tblC c
JOIN tblB b
ON (find_in_set(b.userid,c.userids) > 0)
where c.nname="new1"
Chỉnh sửa để chuẩn hóa giản đồ
Tôi đã xóa userids
từ tblC
của bạn và thay vào đó, tôi đã tạo một bảng nối mới với tên tblC_user
với 2 cột c_id
điều này sẽ liên quan đến cột id của tblC
và cái thứ hai userid
để lưu trữ người dùng quan hệ người dùng cho tblC
xem lược đồ mẫu cho tblC
CREATE TABLE if not exists tblC
(
id int(11) NOT NULL auto_increment ,
nname varchar(255),
PRIMARY KEY (id)
);
INSERT INTO tblC (id, nname) VALUES
('1', 'new1'),
('2', 'new2'),
('3', 'new3'),
('4', 'new4'),
('5', 'new5');
Và đây là bảng nối của bạn là tblC_user
CREATE TABLE if not exists tblC_user
(
c_id int,
userid int
);
INSERT INTO tblC_user (c_id,userid) VALUES
('1','1'),
('1','2'),
('2','1'),
('2','3'),
('3','1'),
('3','4'),
('4','3'),
('4','2'),
('5','5'),
('5','2');
Ở trên, nếu bạn nhận thấy, tôi đã không lưu trữ bất kỳ quan hệ nào được phân tách bằng dấu phẩy mỗi quan hệ của người dùng cho tblC
được lưu trữ trong hàng mới, đối với bạn có liên quan tập kết quả tôi đã sử dụng bảng nối khi tham gia cũng truy vấn mới sẽ giống như bên dưới
select *
from tblC c
join tblC_user cu on(c.id = cu.c_id)
join tblB b on (b.userid = cu.userid)
where c.nname="new1"
Giờ đây, truy vấn trên có thể được tối ưu hóa bằng cách sử dụng các chỉ mục, bạn có thể duy trì các quan hệ xếp tầng một cách dễ dàng