连接具有逗号分隔列的表
连接其中一列包含逗号分隔值的表时,查找匹配记录可能会很困难。要解决这个问题,一个可行的方法是利用 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中文网其他相关文章!