mysql根据某个字段已存在的值排序
问题描述
因为之前数据库结构没设计好,导致现在数据很混乱。1.就比如下面那个 values 字段,想让他里面从小到大的排序。比如第一个变成 ['133','136','257']我知道php能做,但是我现在想研究一下mysql相关的函数,请问是否有支持的。。
因为我之前做 批量更新的时候,就发现mysql有这个办法,感觉很强大
问题解答
回答1:写个MySQL函数,在里面拆字符串,排序。
例如可以这样:
CREATE FUNCTION `sort_col`(`input` VARCHAR(50)) RETURNS VARCHAR(50) LANGUAGE SQL NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER COMMENT ’’BEGINdeclare a int;declare b int;declare c int;set a = cast(substr(input, 3, 3) as int);set b = cast(substr(input, 9, 3) as int);set c = cast(substr(input, 15, 3) as int);if (a <= b && b <= c) then return concat(’['’, a, ’','’, b , ’','’, c , ’']’);elseif (b <= a && a <= c) then return concat(’['’, b, ’','’, a , ’','’, c , ’']’);elseif (c <= a && a <= b) then return concat(’['’, c, ’','’, a , ’','’, b , ’']’);elseif (c <= b && b <= a) then return concat(’['’, c, ’','’, b , ’','’, a , ’']’);elseif (a <= c && c <= b) then return concat(’['’, a, ’','’, c , ’','’, b , ’']’);elseif(b <= c && c <= a) then return concat(’['’, b, ’','’, c , ’','’, a , ’']’);end if;END
然后就可以更新了:
update table_name set values = sort_col(values);
(上面的函数假设了数字都是3位,不用直接用哦)
MySQL 5.7支持JSON了,把字段转成JSON也许可以。
回答2:表设计的的时候就应该保证这个值的原子性、这是设计上的失误,mysql不会为这种失误出解决方案吧
回答3:靠mysql应该没什么办法,写个脚本处理下吧。
相关文章:
1. docker-machine添加一个已有的docker主机问题2. 关于docker下的nginx压力测试3. angular.js - angularjs的自定义过滤器如何给文字加颜色?4. docker内创建jenkins访问另一个容器下的服务器问题5. docker网络端口映射,没有方便点的操作方法么?6. 请问怎么改变超链接字体的颜色?7. 关docker hub上有些镜像的tag被标记““This image has vulnerabilities””8. angular.js - angular2 有什么cool的loading组件么?9. java编程思想第4版中文版的几处谬误?10. python - 内容审核(图片鉴别)回调无数据?
![docker-machine添加一个已有的docker主机问题](http://www.haobala.com/attached/image/news/202311/1028320972.png)