Anda dapat melakukannya dengan SQL murni seperti ini
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
Catatan: Triknya adalah dengan memanfaatkan tabel penghitungan (angka) dan sangat berguna dalam hal ini fungsi MySQL SUBSTRING_INDEX()
. Jika Anda melakukan banyak kueri (pemisahan) seperti itu, maka Anda mungkin mempertimbangkan untuk mengisi dan menggunakan tabel penghitungan yang bertahan alih-alih membuatnya dengan cepat dengan subkueri seperti dalam contoh ini. Subquery dalam contoh ini menghasilkan urutan angka dari 1 hingga 100 secara efektif memungkinkan Anda membagi hingga 100 nilai yang dibatasi per baris dalam tabel sumber. Jika Anda membutuhkan lebih atau kurang, Anda dapat dengan mudah menyesuaikannya.
Keluaran:
| VALUE | |----------------| | somethingA | | somethingB | | somethingC | | somethingElseA | | somethingElseB |
Ini SQLFiddle demo
Beginilah tampilan kueri dengan tabel penghitungan tetap
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
Ini SQLFiddle demo