Công thức: (LENGTH(full) - LENGTH(REPLACE(full, substr, ''))) / LENGTH(substr). Đối với chuỗi phân cách bởi dấu phẩy, cần xử lý ranh giới.
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (Value TEXT); Query OK, 0 rows affected (0.74 sec)
mysql> INSERT INTO DemoTable VALUES('10,20,10,30,10,40,50,40');
Query OK, 1 row affected (0.24 sec)
Truy vấn đếm xuất hiện của '10' (xử lý ranh giới bằng CONCAT)
mysql> SELECT (LENGTH(Value) + 2 - LENGTH(REPLACE(CONCAT(',', Value, ','), ',10,', 'len'))) FROM DemoTable;
Kết quả: 3 lần
+----------------------------------------------------------------------------+
| LENGTH(Value) + 2 - LENGTH(REPLACE(CONCAT(',', Value, ','), ',10,', 'len')) |
+----------------------------------------------------------------------------+
| 3 |
+----------------------------------------------------------------------------+
1 row in set (0.00 sec)
Giải thích kỹ thuật:
CONCAT(',', Value, ','): thêm dấu phẩy đầu/cuối → ',10,20,10,30,10,40,50,40,'- Tìm ',10,' thay vì '10' để tránh khớp '10' trong '110', '101'
REPLACE(..., ',10,', 'len'): thay ',10,' (3 ký tự) bằng 'len' (3 ký tự) → độ dài không đổi cho phần khớp- Thực tế công thức gốc có lỗi: nên dùng
(LENGTH(CONCAT(',',Value,',')) - LENGTH(REPLACE(CONCAT(',',Value,','), ',10,', ''))) / 3