問題描述
業(yè)務上碰到個需求丰包,要求展示的數據按照老板給定的部門順序排序饶唤,這些部門的順序無法通過原有的字段描述肄程。
解決思路
一開始考慮的解決方法是數據庫新增一個字段,根據權重進行排序得湘。但是考慮到原有的業(yè)務邏輯杖玲,每個月每個部門都有新的數據匯總,如果新增字段的話淘正,整個項目都要大改摆马。
然后考慮過使用一個數據字典存儲權重,在查詢的時候做個多表連接排序鸿吆,但是因為部門比較多囤采,這個方法對性能影響比較大,所以放棄了惩淳。
為了在不影響原有功能的情況下實現這一功能蕉毯,考慮從sql入手,僅在展示頁面(findAll)時對部門進行排序思犁,使用order by 關鍵字代虾。找到一個mysql函數——field(str,str1激蹲,str2棉磨,str3,str4……)学辱,感興趣的同學可以自己看一下乘瓤,這是個按照str1,str2策泣,str3衙傀,str4……的順序返回str查詢到的結果集的函數,如果表中str字段值不存在于str1着降,str2差油,str3,str4中的記錄任洞,放在結果集最前面返回蓄喇。
根據這個啟發(fā),選擇了使用find_in_set(str,strList)函數交掏,find_in_set可以返回str在strList中的位置妆偏,如果str不在strList中,則返回0盅弛,這樣一來钱骂,只要將需要排序的sql后加上order by find_in_set(name,list),就可以實現排序挪鹏,并且對整個項目的其他功能是沒有影響的见秽。后期通過對list的維護,實現排序順序的變動讨盒。
實踐
建表語句
CREATE TABLE `t_test` (
`id` varchar(40) comment '主鍵id',
`strName` varchar(100) NOT NULL comment '部門名',
`remark` varchar(100) NOT NULL comment '備注',
`cost` int(11) NOT NULL comment '成本',
PRIMARY KEY (`id`) USING BTREE
)
測試數據
insert into `t_test` values(UUID(),'技術部',null,12);
insert into `t_test` values(UUID(),'銷售部',null,1);
insert into `t_test` values(UUID(),'人資處',null,132);
insert into `t_test` values(UUID(),'辦事處',null,123);
insert into `t_test` values(UUID(),'蘋果部',null,233);
insert into `t_test` values(UUID(),'香蕉部門',null,120);
要求按照:香蕉部門解取、辦事處、人資處返顺、蘋果部禀苦,的順序展示信息,不存在的部門放在最后
解決方案
select * from t_test
order by find_in_set(strName,'香蕉部門,辦事處,人資處,蘋果部');
總結
這個方法不一定是最好的遂鹊,但在綜合考慮開發(fā)成本振乏、對項目的影響、功能的使用頻率來說秉扑,是比較適用于該場景的方案慧邮。