一个关于mysql的问题,虽然解出来了,但是依旧很疑惑,有没有前辈可以指点一下?
本帖最后由 liangyun 于 2019-11-18 10:41 编辑开发的时候碰到类似这么一个问题:
mysql中有表:
~~~mysql
create table dept(
id int auto_increment primary key comment 'id',
level int comment '权重,1--普通员工,2--经理',
namevarchar(15) comment '员工姓名'
)
~~~
有一天这个系统用了很长时间了,需要增加一个“副经理”的角色,但是因为1和2已经在很多地方写死了,只能在原来的基础上,将3设为“副经理”,并且设计表的人表示以后绝对不会修改这个表了
本人小白,做外包,所以没办法
差不多就是这样,遇到一个需求,是将表中数据按照职位大小进行排序
然后我是这么写的:
~~~mysql
select * from
dept
order by (4-level)%3 desc
~~~
然后问题虽然是解决了,思路也是我自己想出来的,但是我想不通为什么这样可以运行
有没有前辈能指点一下,这种解决思路是一个算法,还是一个什么思路?有没有通用的可以抽取的地方可以学习?这个问题疑惑了我两个月了,希望可以得到解答 发错板块了,劳烦管理删掉 我想到一种,重构表接口,新增一个表存level ,这里存level表的主键id,
create table dept(
id int auto_increment primary key comment 'id',
level int comment '权重,1--普通员工,2--经理',
sort tinyint(4) comment'顺序'
)
这个表以后还可以扩展其他信息 order by 是根据具体的字段进行排序,可以个也可多个,你使用level进行排序是可以的这个字段本身就是int类型,所以你使用计算公式 (4-level)%3 注意这只是对结果集的一种计算
实际进行排序的是level字段,但是排序的结果是按照(4-level)%3的结果进行排序
这种方法可以算是解决方法,但是更多的还是利用业务在其他地方进行处理,尽量不要使用order by 中进行计算,对性能也非常不友好 elangsun 发表于 2019-11-18 11:27
order by 是根据具体的字段进行排序,可以个也可多个,你使用level进行排序是可以的这个字段本身就是int类型, ...
感谢回复,可能我的提问表述不够好,
我想问的是这种 (4-level)%3 之后可以改变排序方式是不是一种算法,如果是的话,叫什么名字
另外请教如果不在order by中进行计算的话,如何利用业务处理?能否提供一种思路?我只能想到一次查询然后合并数据了 暴躁的鹅卵石 发表于 2019-11-18 10:57
我想到一种,重构表接口,新增一个表存level ,这里存level表的主键id,
create table dept(
id i ...
嗯,有道理,感谢,如果我是本公司员工的话,如果新增别的角色,把原来的level当做职称看到是一种非常明智的选择。非常感谢。 (4-3)%3 = 1 // 副经理
(4-2)%3 = 2 // 经理
(4-1)%3 = 0 // 员工
建议直接这样写: SELECT * FROM dept ORDER BY field(level, 2, 3, 1); 浔無涯 发表于 2019-11-18 12:00
(4-3)%3 = 1 // 副经理
(4-2)%3 = 2 // 经理
(4-1)%3 = 0 // 员工
好棒,第一次见到field的这种用法,感谢
页:
[1]