Vấn đề
Cột lưu chuỗi số: '245,654,76,89,98'. Cần sắp xếp theo **số đầu tiên** (245, 2000, 1001...).
Giải pháp: SUBSTRING_INDEX + CAST + ORDER BY
ORDER BY CAST(SUBSTRING_INDEX(SetOfNumbers, ',', 1) AS UNSIGNED)
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (SetOfNumbers TEXT);
mysql> INSERT INTO DemoTable VALUES
('245,654,76,89,98'), ('2000,567,9090,6789'), ('1001,90595,657,99');
Truy vấn
mysql> SELECT * FROM DemoTable ORDER BY CAST(SUBSTRING_INDEX(SetOfNumbers, ',', 1) AS UNSIGNED);
Kết quả
+--------------------+ | SetOfNumbers | +--------------------+ | 245,654,76,89,98 | -- 245 | 1001,90595,657,99 | -- 1001 | 2000,567,9090,6789 | -- 2000 +--------------------+
Giải thích
SUBSTRING_INDEX(str, ',', 1): Lấy phần trước dấu phẩy **đầu tiên** (count=1 > 0). Trả về '245', '2000', '1001'.CAST(... AS UNSIGNED): Chuyển chuỗi sang số không âm để so sánh số học (1001 < 2000), không phải so sánh chuỗi ('1001' > '2000' theo lexicographic).
SUBSTRING_INDEX chi tiết
SUBSTRING_INDEX('a,b,c', ',', 1) → 'a' (trước dấu phẩy 1)
SUBSTRING_INDEX('a,b,c', ',', 2) → 'a,b' (trước dấu phẩy 2)
SUBSTRING_INDEX('a,b,c', ',', -1) → 'c' (sau dấu phẩy cuối)
SUBSTRING_INDEX('a,b,c', ',', -2) → 'b,c' (sau dấu phẩy倒数2)
Lưu ý
- Không dùng index → full table scan + filesort.
- Dữ liệu không chuẩn (thiếu dấu phẩy, khoảng trắng) → CAST có thể sai. Cần TRIM/REPLACE trước.
- Thiết kế tốt hơn: Tách bảng chi tiết (normalization).