mysql 字符串拆分排序
时间: 2023-08-08 19:10:53 浏览: 105
可以使用 MySQL 内置的字符串函数和排序函数来拆分和排序字符串。以下是一个示例:
假设有一个名为 `str` 的字符串列,其中包含多个以逗号分隔的子字符串,你可以使用 `SUBSTRING_INDEX` 函数将其拆分成单独的子字符串:
```sql
SELECT SUBSTRING_INDEX(str, ',', 1) AS substring1,
SUBSTRING_INDEX(SUBSTRING_INDEX(str, ',', 2), ',', -1) AS substring2,
SUBSTRING_INDEX(SUBSTRING_INDEX(str, ',', 3), ',', -1) AS substring3
FROM mytable;
```
这将返回一个结果集,其中包含每个字符串的前三个子字符串,分别命名为 `substring1`、`substring2` 和 `substring3`。
要按照其中一个子字符串排序,可以使用 `ORDER BY` 子句,并将子字符串列用作排序键:
```sql
SELECT SUBSTRING_INDEX(str, ',', 1) AS substring1
FROM mytable
ORDER BY substring1;
```
这将按照第一个子字符串对结果进行排序。如果你想按照第二个或第三个子字符串排序,只需将 `SUBSTRING_INDEX` 函数的第二个参数更改为相应的值即可。
相关问题
MySQL order by 排序乱 字段varchar 存数组或者字符串
如果你的字段是存储数组或字符串,那么在使用 `ORDER BY` 进行排序时,MySQL会按照字符串的字典顺序进行排序,而不是按照数组元素的大小进行排序,这可能会导致排序结果不是你所期望的。
如果你想按照数组元素的大小进行排序,你可以使用 MySQL 内置函数 `SUBSTRING_INDEX`,将字段中的数组或字符串拆分成单独的元素,然后按照这些元素的大小进行排序。
例如,如果你的字段名为 `my_field`,存储了一个以逗号分隔的字符串数组,你可以使用以下查询语句进行排序:
```
SELECT * FROM my_table ORDER BY CAST(SUBSTRING_INDEX(my_field, ',', 1) AS UNSIGNED), CAST(SUBSTRING_INDEX(my_field, ',', 2) AS UNSIGNED), ...
```
这个查询语句会将 `my_field` 字段按照第一个元素的大小进行排序,如果第一个元素相同,则按照第二个元素的大小进行排序,以此类推。注意,需要将元素转换为 `UNSIGNED` 类型,才能按照其大小进行排序。
如果你的数组或字符串中包含了不同类型的元素,如字符串和数字,那么你需要对不同类型的元素使用不同的排序方式。例如,你可以使用 `ORDER BY` 子句中的 `CASE` 语句,针对不同类型的元素使用不同的排序方式:
```
SELECT * FROM my_table ORDER BY
CASE WHEN my_field REGEXP '^[0-9]+$' THEN CAST(my_field AS UNSIGNED)
ELSE my_field END,
...
```
这个查询语句会首先按照 `my_field` 是否为数字进行判断,如果是数字,则按照数字大小进行排序,否则按照字符串的字典顺序进行排序。
mysql 拆分数组字符串
如果你的 MySQL 表中存在一个列,其存储了以逗号分隔的字符串,你可以使用 MySQL 的内置函数 `SUBSTRING_INDEX()` 和 `GROUP_CONCAT()` 来拆分这个字符串。
例如,如果你有一个名为 `users` 的表,其中有一个名为 `hobbies` 的列,存储了以逗号分隔的字符串,你可以使用以下查询来拆分这个字符串:
```
SELECT u.id, SUBSTRING_INDEX(SUBSTRING_INDEX(u.hobbies, ',', n.n), ',', -1) as hobby
FROM users u
CROSS JOIN (
SELECT a.N + b.N * 10 + 1 n
FROM
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a,
(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
ORDER BY n
) n
WHERE n.n <= 1 + (LENGTH(u.hobbies) - LENGTH(REPLACE(u.hobbies, ',', ''))))
ORDER BY u.id, hobby;
```
这个查询将 `users` 表中的每个 `hobbies` 列拆分成一个单独的行,并将结果按照 `id` 和 `hobby` 排序。
注意:这个查询使用了一个子查询来生成一个数字序列,以便对字符串进行拆分。如果你知道你需要拆分的字符串的最大长度,你可以手动指定一个数字序列,而不必使用子查询。
阅读全文