MySQL中使用ORDER BY FIELD时如何为两个门店位置值赋予同等排序权重?
解决门店排序权重问题的方案
Got it,咱们来调整这个排序逻辑,完美匹配你的需求!
问题根源
你之前用的FIELD(store.location, "MP12221", "MP62112","MP15314")会给这三个门店分别返回1、2、3的排序值,所以MP12221永远会排在MP62112前面,没法让它们按距离自由排序。
解决方案:用CASE分组控制优先级
我们可以把门店分成三个优先级组,同一组内的门店拥有相同的排序权重,然后再按距离排序:
- 优先级1:除了MP12221、MP62112、MP15314之外的所有门店(最先按距离排序)
- 优先级2:MP12221和MP62112(组内按距离排序)
- 优先级3:MP15314(最后排)
对应的SQL语句如下:
ORDER BY CASE WHEN store.location NOT IN ('MP12221', 'MP62112', 'MP15314') THEN 1 WHEN store.location IN ('MP12221', 'MP62112') THEN 2 WHEN store.location = 'MP15314' THEN 3 END ASC, distance ASC
逻辑说明
- 第一排序条件
CASE语句会给不同组的门店分配相同的优先级数值,这样同一组的门店不会因为门店编码被强制排序; - 第二排序条件
distance ASC会在同一优先级组内按距离从小到大排序,完美实现你要的:- 非目标门店全部按距离排;
- MP12221和MP62112之间按距离排序,谁近谁在前;
- MP15314固定排在最后。
内容的提问来源于stack exchange,提问作者user11092881
相关产品推荐
相关产品推荐

