【问题标题】:sql join tables where 1 column has commasql连接表,其中1列有逗号
【发布时间】:2014-09-01 19:33:12
【问题描述】:

当我搜索“new1”时如何获取所有用户名。例如:我应该获取 A 和 B,因为 tblC 中的用户 ID 1,2 对于具有 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,','))

【问题讨论】:

  • 您需要阅读 TABLE NORMALIZATION
  • @Prix 但是我怎么能这样匹配呢?有可能吗?
  • 应该可以使用ON (FIND_IN_SET(tblB.userid, tblC.userids) > 0) 但这会更好正常化。

标签: mysql sql


【解决方案1】:

你真的应该看看Database normalization,首先通过添加一个联结表来规范你的结构,并保存来自 tablec 的关系每个存储在 tablec 中的关系都将存储在新的联结表中,但不是逗号分隔的列表,每行都将保存 id c 和每行一个用户 ID,如果你不能改变你的架构,你可以使用 find_in_set 在集合中查找值

select *  
from  tblC c
JOIN tblB b
ON (find_in_set(b.userid,c.userids) > 0)
where c.nname="new1"

See demo


编辑规范化架构

我已经从您的tblC 中删除了userids 列,而是创建了一个新的联结表tblC_user,其中包含两列c_id 这将与tblC 的id 列和第二个@987654331 列相关@ 存储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"

Demo 2

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

【讨论】:

  • 非常感谢先生的上述查询。我怎样才能规范化相同的 3 个表并使用您正在谈论的查询。如果您能向我展示相同的内容,那将是一个很大的帮助。真的很感激它。
  • 谢谢你,rock。我在这里有一个额外的查询。如果在上述情况下我开始输入“ne”或“new”(auto_suggestion)所有字段都有这个文本,所以如果有歧义我该怎么做处理这个问题?很抱歉给您带来麻烦,但这一直让我担心。有什么建议吗?
  • @jason 最好提出一个包含所有相关细节的新问题,也可以在这里提供新问题的链接,所以我也会尝试看看问候
  • 谢谢您会在某个时候这样做并在此处发布链接。再次感谢您的时间。
猜你喜欢
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2014-10-15
  • 2012-04-19
相关资源
最近更新 更多