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

标签 mysql sql

我有 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/

相关文章:

mysql - Ansible 安装 MySql 5.7 - 设置 Root 用户密码

php - 为相同的值插入多行 - SQL

mysql - GROUP BY 从特定日期开始 X 天的时间间隔

sql - 根据列的当前值更新列

php - 如何在 php 中 move_uploaded_file 时重命名文件?

MySQL 通过 SSH 从 Linux 复制到 Windows 上的 MySQL?

mysql - 如何在 SQL 中获取每周平均销售商品数?

MySQL SELECT 基于不同列中的值的增量索引

sql - 如何获得两行之间的差异

PHP PDO : How to insert multiple rows?