Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL - ordina la stringa separata da virgole nella colonna

È possibile, ma non proprio una buona idea.

Ad esempio, puoi dividere un elenco separato da virgole generando un intervallo di numeri e utilizzandolo con SUBSTRING_INDEX per ottenere ogni elemento. Tuttavia, l'intervallo di numeri deve essere grande quanto il numero massimo di valori delimitati.

Puoi quindi utilizzare GROUP_CONCAT per unirti all'elenco nell'ordine corretto. Nota che l'ordine sarà diverso a seconda che tu abbia eseguito il cast dei valori suddivisi come numeri/interi o li abbia lasciati come stringhe.

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;

Dimostrato qui su SQL fiddle (se SQL fiddle decide di funzionare):-

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

La prima selezione sta lanciando i valori come interi per ordinarli numericamente, la seconda non li sta lanciando ma li lascia semplicemente come stringhe, quindi l'ordinamento è diverso.