当我搜索“ new1”时,如何获取所有用户名。例如:我应该以tblC中的userid 1,2为A和B来获取具有new1的row1的1,2,应该使用什么查询来获得上述结果?非常感谢您的帮助。 http://sqlfiddle.com/#!2/1ab8e/2
CREATE TABLE if not exists tblA ( id int(11) NOT NULL auto_increment , user varchar(255), category int(255), PRIMARY KEY (id) ); CREATE TABLE if not exists tblB ( id int(11) NOT NULL auto_increment , username varchar(255), userid int(255), PRIMARY KEY (id) ); CREATE TABLE if not exists tblC ( id int(11) NOT NULL auto_increment , nname varchar(255), userids varchar(255), PRIMARY KEY (id) ); INSERT INTO tblA (user, category ) VALUES ('1', '1'), ('1', '2'), ('1', '3'), ('1', '1'), ('2', '1'), ('2', '1'), ('2', '1'), ('2', '1'), ('3', '1'), ('2', '1'), ('4', '1'), ('4', '1'), ('2', '1'); INSERT INTO tblB (userid, username ) VALUES ('1', 'A'), ('2', 'B'), ('3', 'C'), ('4', 'D'), ('5', 'E'); INSERT INTO tblC (id, nname,userids ) VALUES ('1', 'new1','1,2'), ('2', 'new2','1,3'), ('3', 'new3','1,4'), ('4', 'new4','3,2'), ('5', 'new5','5,2');
到目前为止查询:
select * where nname="new1" from tblC CROSS JOIN tblB ON tblB.userid=(SELECT userids FROM substr(tblC.userids,','))
您应该真正看一下 数据库的规范化 ,首先通过添加一个联结表并保持来自tablec的关系来规范化您的结构,存储在tablec中的每个关系都将存储在新的联结表中,但不是以逗号分隔的列表,每一行将保存c和一个id每行的用户ID,如果您无法更改架构,则可以使用它find_in_set来查找set中的值
find_in_set
select * from tblC c JOIN tblB b ON (find_in_set(b.userid,c.userids) > 0) where c.nname="new1"
观看演示
编辑以规范化架构
我已经userids从您的列中删除了列tblC,而是创建了一个新的联结表,tblC_user其中包含2列,c_id这将与ID列相关tblC,第二列 userid存储用户关系用户以tblC查看示例架构 tblC
userids
tblC
tblC_user
c_id
userid
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"
演示2
现在可以通过使用索引来优化上面的查询,您可以轻松维护级联关系