Mengoptimumkan Pertanyaan SQL untuk Jadual dengan Nilai Lajur Dipisahkan Koma
Apabila berurusan dengan jadual di mana lajur mengandungi nilai dipisahkan koma, melaksanakan khusus pertanyaan boleh mencabar. Senario biasa ialah mendapatkan semula semua data yang berkaitan apabila mencari nilai tertentu dalam lajur yang dipisahkan koma.
Isu:
Anda perlu mendapatkan semula semua nama pengguna yang dikaitkan dengan tertentu nilai dalam lajur yang dipisahkan koma. Sebagai contoh, daripada struktur jadual di bawah, anda ingin mencari semua nama pengguna apabila anda mencari "new1."
Jadual:
CREATE TABLE tblA ( id int NOT NULL AUTO_INCREMENT , user varchar(255), category int(255), PRIMARY KEY (id) ); CREATE TABLE tblB ( id int NOT NULL AUTO_INCREMENT , username varchar(255), userid int(255), PRIMARY KEY (id) ); CREATE TABLE tblC ( id int NOT NULL AUTO_INCREMENT , nname varchar(255), userids varchar(255), PRIMARY KEY (id) ); INSERT INTO tblA (user, category ) VALUES ('1', '1'), ('1', '2'), ('1', '3'), ('1', '1'), ('2', '1'), ('2', '1'), ('2', '1'), ('2', '1'), ('3', '1'), ('2', '1'), ('4', '1'), ('4', '1'), ('2', '1'); INSERT INTO tblB (userid, username ) VALUES ('1', 'A'), ('2', 'B'), ('3', 'C'), ('4', 'D'), ('5', 'E'); INSERT INTO tblC (id, nname,userids ) VALUES ('1', 'new1','1,2'), ('2', 'new2','1,3'), ('3', 'new3','1,4'), ('4', 'new4','3,2'), ('5', 'new5','5,2');
Pertanyaan:
select * where nname="new1" from tblC CROSS JOIN tblB ON tblB.userid=(SELECT userids FROM substr(tblC.userids,','))
Batasan:
Pertanyaan ini bergantung pada Fungsi SUBSTR dan FIND_IN_SET, yang boleh menjadi tidak cekap untuk set data yang besar. Selain itu, ia menganggap hanya satu nilai dipisahkan koma bagi setiap baris, yang mungkin tidak selalu berlaku.
Penyelesaian Disyorkan:
Penormalan Pangkalan Data:
Normalkan skema pangkalan data anda dengan mencipta jadual berasingan untuk dipisahkan koma nilai. Ini menghapuskan ketidakcekapan mencari melalui rentetan dan memudahkan pertanyaan.
Skema Contoh:
CREATE TABLE tblC ( id int NOT NULL AUTO_INCREMENT , nname varchar(255), PRIMARY KEY (id) ); CREATE TABLE tblC_user ( c_id int NOT NULL, userid int NOT NULL ); INSERT INTO tblC (id, nname) VALUES ('1', 'new1'), ('2', 'new2'), ('3', 'new3'), ('4', 'new4'), ('5', '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');
Dioptimumkan Pertanyaan:
select * from tblC c join tblC_user cu on(c.id = cu.c_id) join tblB b on (b.userid = cu.userid) where c.nname="new1"
Faedah:
Atas ialah kandungan terperinci Bagaimana untuk Mengoptimumkan Pertanyaan SQL untuk Jadual dengan Nilai Dipisahkan Koma?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!