首页 > 数据库 > mysql教程 > 如何有效地连接具有逗号分隔值的表?

如何有效地连接具有逗号分隔值的表?

Patricia Arquette
发布: 2024-12-24 05:45:09
原创
996 人浏览过

How to Efficiently Join Tables with Comma-Separated Values?

连接具有逗号分隔列的表

连接其中一列包含逗号分隔值的表时,查找匹配记录可能会很困难。要解决这个问题,一个可行的方法是利用 find_in_set 函数。

使用 find_in_set 的示例查询

假设我们有以下模式:

CREATE TABLE tblC (
  id INT NOT NULL AUTO_INCREMENT,
  nname VARCHAR(255),
  userids VARCHAR(255),
  PRIMARY KEY (id)
);

CREATE TABLE tblB (
  id INT NOT NULL AUTO_INCREMENT,
  username VARCHAR(255),
  userid INT,
  PRIMARY KEY (id)
);

INSERT INTO tblC (nname, userids) VALUES
('new1', '1,2'),
('new2', '1,3'),
('new3', '1,4'),
('new4', '3,2'),
('new5', '5,2');

INSERT INTO tblB (username, userid) VALUES
('A', 1),
('B', 2),
('C', 3),
('D', 4),
('E', 5);
登录后复制

要在搜索“new1”时查找所有用户名,我们可以使用以下命令query:

SELECT *
FROM tblC AS c
JOIN tblB AS b
ON (find_in_set(b.userid, c.userids) > 0)
WHERE c.nname = 'new1';
登录后复制

规范化注意事项

但是,需要注意的是,在单个列中存储逗号分隔值被视为违反数据库规范化原则。更好的方法是使用单独的联结表来保存 tblC 中每行的用户关联。这将消除对 find_in_set 的需求,并允许更高效的查询。

标准化架构示例

CREATE TABLE tblC (
  id INT NOT NULL AUTO_INCREMENT,
  nname VARCHAR(255),
  PRIMARY KEY (id)
);

CREATE TABLE tblC_user (
  c_id INT,
  userid INT,
  PRIMARY KEY (c_id, userid)
);

INSERT INTO tblC (nname) VALUES
('new1'),
('new2'),
('new3'),
('new4'),
('new5');

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);
登录后复制

使用标准化架构查询

SELECT *
FROM tblC AS c
JOIN tblC_user AS cu ON (c.id = cu.c_id)
JOIN tblB AS b ON (b.userid = cu.userid)
WHERE c.nname = 'new1';
登录后复制

通过使用规范化模式,我们优化查询性能并确保数据通过消除重复或不一致的关系来保持完整性。

以上是如何有效地连接具有逗号分隔值的表?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板