Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีนับจำนวนค่าที่คั่นด้วยจุลภาคในคอลัมน์ MySQL

นับจำนวนรายการในสตริง 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 แทน