我有 table :
+-----+------------+--------------+
| 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 文档中寻找一些函数,但什么也没找到。
最佳答案
这是可能的,但并不是一个好主意。
作为示例,您可以通过生成一系列数字并将其与 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 fiddle 上演示(如果 SQL fiddle 决定工作):-
http://www.sqlfiddle.com/#!9/c9703ee/4
第一个选择将值转换为整数以对它们进行数字排序,第二个选择不转换它们而是将它们保留为字符串,因此排序顺序不同。
关于MySQL - 对列中逗号分隔的字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43724165/