Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyertai Jadual dengan Cekap dengan Nilai Dipisahkan Koma?

Bagaimana untuk Menyertai Jadual dengan Cekap dengan Nilai Dipisahkan Koma?

Patricia Arquette
Patricia Arquetteasal
2024-12-24 05:45:091027semak imbas

How to Efficiently Join Tables with Comma-Separated Values?

Menyertakan Jadual dengan Lajur Dipisahkan Koma

Apabila menyertai jadual di mana satu lajur mengandungi nilai dipisahkan koma, mencari rekod yang sepadan boleh menjadi mencabar. Untuk menyelesaikan isu ini, pendekatan yang berdaya maju ialah menggunakan fungsi find_in_set.

Contoh Pertanyaan dengan find_in_set

Andaikan kita mempunyai skema berikut:

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);

Untuk mencari semua nama pengguna semasa mencari "new1", kita boleh menggunakan yang berikut pertanyaan:

SELECT *
FROM tblC AS c
JOIN tblB AS b
ON (find_in_set(b.userid, c.userids) > 0)
WHERE c.nname = 'new1';

Pertimbangan Normalisasi

Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa menyimpan nilai yang dipisahkan koma dalam satu lajur dianggap sebagai pelanggaran prinsip normalisasi pangkalan data. Pendekatan yang lebih baik ialah mempunyai jadual simpang yang berasingan untuk memegang persatuan pengguna bagi setiap baris dalam tblC. Ini akan menghapuskan keperluan untuk find_in_set dan membolehkan pertanyaan yang lebih cekap.

Sampel Skema Dinormalkan

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);

Pertanyaan dengan Skema Dinormalisasi

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';

Dengan menggunakan skema ternormal, kami mengoptimumkan prestasi pertanyaan dan memastikan data integriti dengan menghapuskan hubungan pendua atau tidak konsisten.

Atas ialah kandungan terperinci Bagaimana untuk Menyertai Jadual dengan Cekap dengan Nilai Dipisahkan Koma?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn