


Bagaimana untuk Mengoptimumkan Pertanyaan SQL untuk Jadual dengan Nilai Dipisahkan Koma?
Dec 18, 2024 am 12:24 AMMengoptimumkan 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:
- Peningkatan prestasi disebabkan operasi gabungan yang cekap
- Mengurangkan kerumitan dengan menghapuskan manipulasi rentetan fungsi
- Kebolehselenggaraan dan fleksibiliti dalam menampung masa hadapan perubahan pada struktur data
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!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Kurangkan penggunaan memori MySQL di Docker

Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table?

Cara menyelesaikan masalah MySQL tidak dapat membuka perpustakaan bersama

Apa itu SQLite? Gambaran Keseluruhan Komprehensif

Jalankan MySQL di Linux (dengan/tanpa bekas podman dengan phpmyadmin)

Menjalankan Pelbagai Versi MySQL di MacOS: Panduan Langkah demi Langkah

Bagaimanakah saya menjamin MySQL terhadap kelemahan biasa (suntikan SQL, serangan kekerasan)?

Apakah beberapa alat GUI MySQL yang popular (mis., MySQL Workbench, phpmyadmin)?
