連接具有逗號分隔列的表
連接其中一列包含逗號分隔值的表時,查找匹配記錄可能會很困難。要解決這個問題,一個可行的方法是利用 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中文網其他相關文章!