집 >데이터 베이스 >MySQL 튜토리얼 >쉼표로 구분된 값을 사용하여 테이블을 효율적으로 조인하는 방법은 무엇입니까?
쉼표로 구분된 열로 테이블 조인
한 열에 쉼표로 구분된 값이 포함된 테이블을 조인하는 경우 일치하는 레코드를 찾는 것이 어려울 수 있습니다. 이 문제를 해결하기 위한 실행 가능한 접근 방식은 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'을 검색할 때 모든 사용자 이름을 찾으려면 다음을 사용할 수 있습니다. 쿼리:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!