sql 按照前端传的数组里的值进行自定义排序
要实现的功能:客户有个需求 按照给定的sku顺序排序,不降序,不升序
先看客户给的sku值:
"TU2501", "TU2515", "TU2514","TU2516",
"TU2503","TU2415", "TU2420","TU2416"
以上是客户给定的sku值,我需要的方式前端以数组传给我,因为还要根据sku进行 IN 查询
前端传的数组:
{
"referenceArray":
[ "TU2501", "TU2515","TU2514","TU2516","TU2503","TU2415", "TU2420","TU2416"],
"idGuest": "1725650",
"sortType": 6
}
这里是我要的参数 其中referenceArray就是要排序的顺序值,也是查询的条件值
直接看代码:
public PageBean<CategoryProductVo> getCategoryProductList(CategoryProduct categoryProduct) throws Exception {PageHelper.startPage(categoryProduct.getPageNumber(), categoryProduct.getPageSize());if(categoryProduct.getReferenceArray().length>0){categoryProduct.setSortSku(String.join(",", categoryProduct.getReferenceArray()));}List<CategoryProductVo> list=this.getCategoryProductListAll(categoryProduct);return PageUtil.getPageBean(list);}
要注意的是我使用String.join的方法进行 数组转字符串并以逗号分隔,使用String.join 可以把数组的中括号[ ] 前后都干掉
数组转字符串之后的格式:TU2501,TU2515,TU2514,TU2516,TU2503,TU2415,TU2420,TU2416
接下来看sql语句:
SELECTp.id_product AS idProduct,p.reference AS reference,p.id_shop_default AS idShopDefault,
FROMproduct AS p
WHEREp.state = 1 AND p.active = 1 AND p.reference IN ( 'TP1804', 'TP1805', 'TU2213', 'TP1802', 'TU2308', 'TP1906', 'TP1902', 'TP1806' )
ORDER BY FIND_IN_SET (p.reference ,"TP1804,TP1805,TU2213,TP1802,TU2308,TP1906,TP1902,TP1806")
这里尤其要注意的是:order by 的时候每个值之间一定不要留空格 否则排序不生效 desc 跟 asc也不要加 否则自定义排序就没意义了
FIND_IN_SET(str,strlist),该函数的作用是查询字段(strlist) 中是否包含(str)的结果,返回结果为 null或记录 官方说明
FIND_IN_SET
函数可以用于自定义排序顺序