首頁 > 資料庫 > mysql教程 > 如何有效地連接具有逗號分隔值的表?

如何有效地連接具有逗號分隔值的表?

Patricia Arquette
發布: 2024-12-24 05:45:09
原創
993 人瀏覽過

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板