sql >> Databasteknik >  >> RDS >> Mysql

MySQL - sortera kommaseparerad sträng i kolumn

Det är möjligt, men inte riktigt en bra idé.

Som ett exempel kan du dela upp en kommaseparerad lista genom att generera ett antal nummer och använda det med SUBSTRING_INDEX för att få varje element. Antalet intervall måste dock vara lika stort som det maximala antalet avgränsade värden.

Du kan sedan använda GROUP_CONCAT för att slå samman listan igen i rätt ordning. Observera att ordningen kommer att vara olika beroende på om du har gjort de uppdelade värdena som tal/heltal eller lämnat dem som strängar.

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;

Demonstreras här på SQL-fiol (om SQL-fiol bestämmer sig för att fungera):-

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

Första valet är att casta värdena som heltal för att sortera dem numeriskt, den andra castar inte dem utan bara lämnar dem som strängar, därför är sorteringsordningen annorlunda.




  1. Hur gör man en andra PDO mysql-fråga på en stund från en annan fråga?

  2. Varför använda INCLUDE-satsen när du skapar ett index?

  3. Konvertera mysql DATETIME-kolumnen till epoksekunder

  4. ASIN() Funktion i Oracle