sql >> Base de Datos >  >> RDS >> Mysql

MySQL:ordenar cadenas separadas por comas en la columna

Es posible, pero no es realmente una buena idea.

Como ejemplo, puede dividir una lista separada por comas generando un rango de números y usándolo con SUBSTRING_INDEX para obtener cada elemento. Sin embargo, el rango de números debe ser tan grande como el número máximo de valores delimitados.

Luego podría usar GROUP_CONCAT para volver a unir la lista en el orden correcto. Tenga en cuenta que el orden será diferente dependiendo de si ha convertido los valores divididos como números/enteros o los ha dejado como cadenas.

SELECT id, title, GROUP_CONCAT(aNumber ORDER BY aNumber)
FROM
(
    SELECT id, title, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(numbers, ',', tens.acnt * 10 + units.acnt + 1), ',', -1) AS UNSIGNED) AS aNumber
    FROM some_table
    CROSS JOIN
    (SELECT 0 AS acnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
    CROSS JOIN
    (SELECT 0 AS acnt UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
    WHERE LENGTH(numbers) - LENGTH(REPLACE(numbers, ',', '')) >= tens.acnt * 10 + units.acnt
) sub0
GROUP BY id, title;

Demostrado aquí en SQL fiddle (si SQL fiddle decide funcionar):-

http://www.sqlfiddle.com/#!9/c9703ee/4

La primera selección es convertir los valores como enteros para clasificarlos numéricamente, la segunda no los convierte sino que los deja como cadenas, por lo tanto, el orden de clasificación es diferente.