Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL - trier les chaînes séparées par des virgules dans la colonne

C'est possible, mais pas vraiment une bonne idée.

Par exemple, vous pouvez diviser une liste séparée par des virgules en générant une plage de nombres et en l'utilisant avec SUBSTRING_INDEX pour obtenir chaque élément. Cependant, la plage de nombres doit être aussi grande que le nombre maximum de valeurs délimitées.

Vous pouvez ensuite utiliser GROUP_CONCAT pour regrouper la liste dans le bon ordre. Notez que l'ordre sera différent selon que vous avez converti les valeurs fractionnées en nombres/entiers ou les avez laissées sous forme de chaînes.

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;

Démontré ici sur le violon SQL (si le violon SQL décide de fonctionner):-

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

Le premier select convertit les valeurs en nombres entiers pour les trier numériquement, le second ne les convertit pas mais les laisse simplement sous forme de chaînes, donc l'ordre de tri est différent.