MySQL - 在列中对逗号分隔字符串进行排序

时间:2016-02-03 09:25:14

标签: mysql sql

我有桌子:

+-----+------------+--------------+
| id  | title      | numbers      |
| 2   | Title 1    | 2,8,5        |
| 3   | Title 2    | 50,7,9,4     |
+-----+------------+--------------+

是否可以在列中排序?在这种情况下,列号。

我需要输出有序数字列,如下所示:

+-----+------------+--------------+
| id  | title      | numbers      |
| 2   | Title 1    | 2,5,8        |
| 3   | Title 2    | 4,7,9,50     |
+-----+------------+--------------+

类似的东西:

SELECT id, title, SORT_FUNC(numbers) from table

我在MySQL文档中寻找一些功能,但我一无所获。

1 个答案:

答案 0 :(得分:1)

这是可能的,但不是一个好主意。

例如,您可以通过生成一系列数字来拆分逗号分隔列表,并使用SUBSTRING_INDEX来获取每个元素。但是,数字范围必须与分隔值的最大数量一样大。

然后,您可以使用GROUP_CONCAT以正确的顺序将列表重新加入。请注意,顺序将根据您是否将拆分值转换为数字/整数或将它们保留为字符串而有所不同。

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;

在这里演示SQL小提琴(如果SQL小提琴决定起作用): -

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

第一个选择是将值转换为整数,以数字方式对它们进行排序,第二个选择不是将它们作为字符串进行排序,而是将它们保留为字符串,因此排序顺序不同。