ホームページ >データベース >mysql チュートリアル >カンマ区切り値を使用してテーブルを効率的に結合するにはどうすればよいですか?

カンマ区切り値を使用してテーブルを効率的に結合するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-24 05:45:09996ブラウズ

How to Efficiently Join Tables with Comma-Separated Values?

カンマ区切りの列を使用したテーブルの結合

1 つの列にカンマ区切りの値が含まれるテーブルを結合する場合、一致するレコードを見つけるのが困難になることがあります。この問題を解決するための実行可能なアプローチは、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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。