sql截取、拼接

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Dream_Ryoma/article/details/83183093

数据库中有个商品信息表,表结构如下:

id:int类型,name:varchar类型,score:int类型,publish_time:datetime类型,image_url:varchar类型。

说明:有的商品有图片,有的商品没有图片,没有图片的设置了一张默认图片。而且表中的图片url都省略了域名,默认图片存在一个服务器,有图片的商品存在另一个服务器(最初的设计者设计的,也是很烦啊~)。

需求如下:要求查询商品,查询结果先按照 score 字段倒叙排,score 相同的记录按照 image_url 排(先展示有图片的,后展示没有图片的,也就是图片是默认图片的),image_url 相同的记录按照 publish_time 倒叙排。

按照 score 和 publish_time 字段排序很好处理,只需如下sql:

select * from goods order by score desc,publish_time desc

查询结果如下图:

可是如何按照image_url字段排序呢?

因为字符集有默认的排序规则,即按照二十六个字符从小到大。可是需求中并不是要这样排序,而是要先展示有图片的,后展示使用默认图片的。数据库中的数据我去掉了域名,域名是不一样(上面已经说过了)。但是虽然域名不一样,但是图片在服务器上的文件路径是相同的,那这就好办了呀,只截取文件名,然后按照默认的字符集排序规则就可以了呀(默认图片都是default.png,而有图片的商品名称则是以picture开头,后面追加一个自增的序号)。

实现需求的sql如下:

扫描二维码关注公众号,回复: 3722473 查看本文章
select * from goods order by score desc,SUBSTR(image_url,INSTR(image_url,'/data/')+6,8) desc,publish_time desc

先按照分数倒叙排,再按照图片,最后按照发布时间。

重点在处理图片的部分:instr函数在image_url字段中查找‘/data/’出现的下标,返回的是第一个“/”的下标,加6以后得到的就是图片名称的第一个字母的下标。substr函数在image_url字段中从instr函数的返回结果出开始截取,截取长度为8。最后按照截取到的字符串排序(截取到的字符串为picture0、picture2...default.)。

MySql中的字符串截取函数很多:left、right、substring、substring_index。本例中使用的是substr(等价于substring)。

MySql中字符串拼接的函数:concat。

 

猜你喜欢

转载自blog.csdn.net/Dream_Ryoma/article/details/83183093
今日推荐