>데이터 베이스 >MySQL 튜토리얼 >쉼표로 구분된 값을 사용하여 테이블을 효율적으로 조인하는 방법은 무엇입니까?

쉼표로 구분된 값을 사용하여 테이블을 효율적으로 조인하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-24 05:45:09999검색

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'을 검색할 때 모든 사용자 이름을 찾으려면 다음을 사용할 수 있습니다. 쿼리:

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.