นับจำนวนรายการในสตริง CSV ด้วย CHAR_LENGTH และ REPLACE
เมื่อคอลัมน์เก็บค่าหลายค่าคั่นด้วยจุลภาค (เช่น 'MySQL,MongoDB') สามารถนับจำนวนรายการได้โดยเปรียบเทียบความยาวสตริงก่อนและหลังลบจุลภาคออก
สูตร: (ความยาวทั้งหมด - ความยาวหลังลบตัวคั่น) / ความยาวตัวคั่น + 1
สำหรับจุลภาค (ความยาว 1): CHAR_LENGTH(col) - CHAR_LENGTH(REPLACE(col, ',', '')) + 1
ตัวอย่างสร้างตารางและข้อมูล
CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Subject LONGTEXT
);
INSERT INTO DemoTable (Subject) VALUES
('MySQL,MongoDB'), ('MySQL,MongoDB'), ('MongoDB'), ('MySQL');
ข้อมูลในตาราง
+----+---------------+ | Id | Subject | +----+---------------+ | 1 | MySQL,MongoDB | | 2 | MySQL,MongoDB | | 3 | MongoDB | | 4 | MySQL | +----+---------------+
คำสั่งนับจำนวนรายการใน Subject ของ Id = 1
SELECT Id,
CHAR_LENGTH(Subject) - CHAR_LENGTH(REPLACE(Subject, ',', '')) + 1 AS FreqSubject
FROM DemoTable
WHERE CHAR_LENGTH(Subject) > 0 AND Id = 1;
ผลลัพธ์
+----+-------------+ | Id | FreqSubject | +----+-------------+ | 1 | 2 | +----+-------------+
คำอธิบาย:
CHAR_LENGTH(Subject)ความยาวสตริงต้นฉบับ (รวมจุลภาค)REPLACE(Subject, ',', '')ลบจุลภาคทั้งหมดCHAR_LENGTH(...)ความยาวหลังลบจุลภาค- ความต่าง = จำนวนจุลภาค → จำนวนรายการ = จำนวนจุลภาค + 1
WHERE CHAR_LENGTH(Subject) > 0กันกรณีสตริงว่าง (จะได้ 1 แทนที่จะเป็น 0)
⚠ ข้อจำกัด: วิธีนี้สมมติว่าไม่มีจุลภาคซ้อน (,,) ไม่มีช่องว่างรอบจุลภาค และไม่มีจุลภาคอยู่ในค่าจริง ควร Normalize ข้อมูลให้เป็นตารางแยก (One-to-Many) แทนเพื่อความถูกต้องและประสิทธิภาพ
MySQL 8.0+ แนะนำ: ใช้ JSON_LENGTH() กับคอลัมน์ JSON Array แทน