吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1504|回复: 7
收起左侧

[求助] 一个关于mysql的问题,虽然解出来了,但是依旧很疑惑,有没有前辈可以指点一下?

[复制链接]
liangyun 发表于 2019-11-18 10:39
本帖最后由 liangyun 于 2019-11-18 10:41 编辑

开发的时候碰到类似这么一个问题:

mysql中有表:

create table dept(
    id    int auto_increment primary key comment 'id',
    level int comment '权重,1--普通员工,2--经理',
    name  varchar(15) comment '员工姓名'
)

有一天这个系统用了很长时间了,需要增加一个“副经理”的角色,但是因为1和2已经在很多地方写死了,只能在原来的基础上,将3设为“副经理”,并且设计表的人表示以后绝对不会修改这个表了

本人小白,做外包,所以没办法

差不多就是这样,遇到一个需求,是将表中数据按照职位大小进行排序

然后我是这么写的:

select * from
dept
order by (4-level)%3 desc

然后问题虽然是解决了,思路也是我自己想出来的,但是我想不通为什么这样可以运行

有没有前辈能指点一下,这种解决思路是一个算法,还是一个什么思路?有没有通用的可以抽取的地方可以学习?这个问题疑惑了我两个月了,希望可以得到解答

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| liangyun 发表于 2019-11-18 10:41
发错板块了,劳烦管理删掉
暴躁的鹅卵石 发表于 2019-11-18 10:57
我想到一种,重构表接口,新增一个表存level ,这里存level表的主键id,
create table dept(
    id    int auto_increment primary key comment 'id',
    level int comment '权重,1--普通员工,2--经理',
    sort tinyint(4) comment'顺序'
)

这个表以后还可以扩展其他信息

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
liangyun + 1 + 1 谢谢@Thanks!

查看全部评分

elangsun 发表于 2019-11-18 11:27
order by 是根据具体的字段进行排序,可以个也可多个,你使用level进行排序是可以的这个字段本身就是int类型,所以你使用计算公式 (4-level)%3   注意这只是对结果集的一种计算
实际进行排序的是level字段,但是排序的结果是按照(4-level)%3的结果进行排序

这种方法可以算是解决方法,但是更多的还是利用业务在其他地方进行处理,尽量不要使用order by 中进行计算,对性能也非常不友好
 楼主| liangyun 发表于 2019-11-18 11:35
elangsun 发表于 2019-11-18 11:27
order by 是根据具体的字段进行排序,可以个也可多个,你使用level进行排序是可以的这个字段本身就是int类型, ...

感谢回复,可能我的提问表述不够好,
我想问的是这种 (4-level)%3 之后可以改变排序方式是不是一种算法,如果是的话,叫什么名字
另外请教如果不在order by中进行计算的话,如何利用业务处理?能否提供一种思路?我只能想到一次查询然后合并数据了
 楼主| liangyun 发表于 2019-11-18 11:42
暴躁的鹅卵石 发表于 2019-11-18 10:57
我想到一种,重构表接口,新增一个表存level ,这里存level表的主键id,
create table dept(
    id    i ...

嗯,有道理,感谢,如果我是本公司员工的话,如果新增别的角色,把原来的level当做职称看到是一种非常明智的选择。非常感谢。
浔無涯 发表于 2019-11-18 12:00
(4-3)%3 = 1 // 副经理
(4-2)%3 = 2 // 经理
(4-1)%3 = 0 // 员工

建议直接这样写: SELECT * FROM dept ORDER BY field(level, 2, 3, 1);

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
liangyun + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| liangyun 发表于 2019-11-18 12:19
浔無涯 发表于 2019-11-18 12:00
(4-3)%3 = 1 // 副经理
(4-2)%3 = 2 // 经理
(4-1)%3 = 0 // 员工

好棒,第一次见到field的这种用法,感谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 00:41

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表