当前位置: 首页 > 面试题库 >

sql连接表,其中1列具有逗号

宇文航
2023-03-14
问题内容

当我搜索“ 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中的值

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

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

现在可以通过使用索引来优化上面的查询,您可以轻松维护级联关系



 类似资料:
  • 问题内容: 我正在运行SQL Server,并且有一个存储过程。我想用WHERE IN子句做一条选择语句。我不知道列表会持续多久,所以我尝试了以下方法 在此解决方案中,@ idList是varChar(max)。但这是行不通的。我听说过要传递表值,但是我对如何做到这一点感到困惑。任何帮助都会很棒 问题答案: 我建议使用一个函数来拆分传入列表(使用Martin在其评论中放置的链接)。 将split函

  • 问题内容: 我有一个查询,在其中我联接了三个单独的表(节点,控件,服务)。 下面是它们的列标题和示例数据。 如您所见,除了 node.serviceID 列之外,数据库表还有一些标准化。我完全衷心同意应规范化 node.serviceID 并创建一对多的数据透视表。那里没有争论。但是,我不控制将信息插入数据库的脚本。我只能从表中读取数据并格式化数据。 因此,下面是我编写的有效的SQL查询,但按预期

  • 问题内容: 我有一个名为fn_SplitCommaSep的表值函数,该函数用逗号分隔文本字段(从’a,b,c’到3行:abc) 如何以表列作为输入将其连接到表? 为此,假设表MyTable具有2列Id和TextWithCommas,并且该表值函数fn_SplitCommaSep产生了一个称为TextWithoutComma的列 例如。像这些之一 或者 问题答案: 除了将逗号分隔的值存储在数据库中之

  • 问题内容: 我有两个表,它们的列数是可变的。(我不知道有多少列或名称会是什么),例如表A和表B。 表A: 表B 询问: 当TableA和TableB都具有相同名称的列时,我无法区分两个不同的列。例如,两个表都有“名称”列,此查询将导致: 我正在寻找一种区分两个表的方法。最好使用预定义的列名称,例如。 我知道“ AS”关键字,但是问题是我不知道这些列名称将是什么。(我不知道TableA或TableB

  • 问题内容: 我的表结构如下所示, “邮件” 列可以包含多个由逗号连接的电子邮件 数据(整数) 邮件(varchar(200)) [数据] [邮件] 1引用m1 @ gmail.com,m2 @ hotmail.com 2引用m2 @ hotmail.com,m3 @ test.com &我需要生成如下的报告,对每封电子邮件的每一行进行计数 [邮件] 听听听听听听听听听听听听听听听听听 [COUNT

  • 问题内容: 我有看起来像这样的数据: 对于每个customer_id,我需要用逗号分隔的列表,以指示该客户运营的月份: 等等。如何使用SQL Server 2005 SQL(而不是T-SQL)轻松生成此逗号分隔的列表? 我在Stack Overflow和其他地方在这里看到的大多数解决方案似乎都是基于联接多个行值而不是列值来创建逗号分隔的列表: T-SQL FOR XML路径(’‘) 关联的子查询与