Bạn có thể làm điều đó với SQL thuần túy như thế này
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value
FROM table1 t CROSS JOIN
(
SELECT a.N + b.N * 10 + 1 n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) n
WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', '')))
ORDER BY value
Lưu ý: Mẹo là tận dụng bảng tally (số) và một hàm rất tiện dụng trong trường hợp này là hàm MySQL SUBSTRING_INDEX()
. Nếu bạn thực hiện nhiều truy vấn như vậy (chia nhỏ) thì bạn có thể cân nhắc điền và sử dụng một bảng kiểm đếm liên tục thay vì tạo nó một cách nhanh chóng với một truy vấn con như trong ví dụ này. Truy vấn con trong ví dụ này tạo ra một chuỗi các số từ 1 đến 100 một cách hiệu quả cho phép bạn phân chia tối đa 100 giá trị được phân tách trên mỗi hàng trong bảng nguồn. Nếu bạn cần nhiều hơn hoặc ít hơn, bạn có thể dễ dàng điều chỉnh nó.
Đầu ra:
| VALUE | |----------------| | somethingA | | somethingB | | somethingC | | somethingElseA | | somethingElseB |
Đây là SQLFiddle bản demo
Đây là cách truy vấn có thể trông với một bảng kiểm đếm liên tục
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.values, ',', n.n), ',', -1) value
FROM table1 t CROSS JOIN tally n
WHERE n.n <= 1 + (LENGTH(t.values) - LENGTH(REPLACE(t.values, ',', '')))
ORDER BY value
Đây là SQLFiddle bản demo