Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Sắp xếp theo số đầu tiên trong chuỗi danh sách số phân cách dấu phẩy trong MySQL


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).