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
Lepaskan: 2024-12-24 05:45:09
asal
1026 orang telah melayarinya

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);
Salin selepas log masuk

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';
Salin selepas log masuk

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);
Salin selepas log masuk

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';
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan