您应该真正查看Database normalization并首先通过添加联结表来规范化您的结构,并保存表格中的关系,存储在tablec中的每个关系都将存储在新的联结表中,但不能作为逗号分隔列表,每行将包含c和一个用户的id每行id,如果无法更改架构,可以使用find_in_set查找set中的值
select *
from tblC c
JOIN tblB b
ON (find_in_set(b.userid,c.userids) > 0)
where c.nname="new1"
编辑规范化架构
我已从tblC中删除了userids列,而是创建了一个新的联结表,因为tblC_user有2列c_id这将与tblC的id列相关,第二个userid用于存储tblC的用户关系用户参见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');
这是你的联结表作为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');
在上面如果你注意到我没有存储任何逗号分隔关系,tblC的用户的每个关系都存储在新行中,对于你关注的结果集我在连接中使用过联结表也新的查询将如下所示
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"
现在上面的查询可以通过使用索引来优化,您可以轻松地维护级联关系