我在搜索" new1"时如何获取所有用户名? 。例如:我应该得到A和B作为用户ID 1,2在tblC是1,2对于row1有新的1.我应该使用什么查询来获得上述结果? 我非常感谢任何帮助。谢谢你提前 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,','))
答案 0 :(得分:2)
你应该真正看看Database normalization并首先通过添加联结表来规范化你的结构,并保存tablec中的关系,tablec中存储的每个关系都将存储在新的联结表中,但不会以逗号分隔列表的形式存储每一行保持c的id和每行一个用户ID,如果你不能改变你的模式,你可以使用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
,这将与tblC
和第二个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"
现在可以通过使用索引来优化上面的查询,您可以轻松地维护级联关系