我最近的任务是根据特定的字符串按顺序放置一列。贝娄是我桌子的截图:
如何按以下顺序对图片列进行排序:
2017/June/06/169799_1_kYFJf.jpg
2017/February/18/169799_2_rkJ2d.jpg
2017/January/12/169799_3_23wKj.jpg
2017/March/18/169799_4_iMbw7.jpg
2017/May/18/169799_5_HwDBf.jpg
我尝试了ORDER BY picture DESC
,但它没有用。
不幸的是我不允许添加新列,例如列" sort",它将定义图像的排序编号。
答案 0 :(得分:3)
试试这个:
SELECT *
FROM test
ORDER BY SUBSTRING(picture, LOCATE(pid, picture) + LENGTH(pid) + 1, 1) DESC
小提琴:http://sqlfiddle.com/#!9/7a334c/3
它是MySQL可随时使用的各种字符串函数的组合
对于SUBSTRING函数,它需要您想要获取子字符串的字符串,起始位置以及要提取的子字符串的长度。
因此,让我们分解用于SUBSTRING函数的三个参数
1。)picture - 我们需要从
中提取数字的列2。)LOCATE(pid,picture)+ LENGTH(pid)+ 1 - 我们正在查找包含图片列中pid子字符串的字符串,然后添加pid本身的长度,以便我们得到"下划线"字符,然后再次添加1以获得"数字"对于排序..这将返回pid之后的数字位置和"下划线"字符
3。)1 - 这表示你需要的长度" cut"或者"提取"从字符串中,如果你有2个数字要提取,这将会产生问题...但是现在,我们可以使用它...
http://www.w3resource.com/mysql/string-functions/mysql-substring-function.php
答案 1 :(得分:2)
您可以尝试这样的事情:
示例数据:
select * from test;
+--------+----------------------------------------+
| pid | picture |
+--------+----------------------------------------+
| 169799 | 2017/March/18/169799_4_iMbw7.jpg |
| 169799 | 2017/February/18/169799_2_jadsflkjasdf |
| 169799 | 2017/June/06/169799_1_jasfd;ads |
| 169799 | 2017/May/18/169799_5_jasfd;ads |
| 169799 | 2017/June/12/169799_10_jasfd;ads |
| 169799 | 2017/January/12/169799_3_iMbw7.jpg |
+--------+----------------------------------------+
select * from test order by str_to_date(substring_index(picture,'/',3), '%Y/%M/%d') desc;
+--------+----------------------------------------+
| pid | picture |
+--------+----------------------------------------+
| 169799 | 2017/June/12/169799_10_jasfd;ads |
| 169799 | 2017/June/06/169799_1_jasfd;ads |
| 169799 | 2017/May/18/169799_5_jasfd;ads |
| 169799 | 2017/March/18/169799_4_iMbw7.jpg |
| 169799 | 2017/February/18/169799_2_jadsflkjasdf |
| 169799 | 2017/January/12/169799_3_iMbw7.jpg |
+--------+----------------------------------------+
<强>解释强>
substring_index(picture,'/',3)
将按/
拆分文字并输出前3项str_to_date(..., '%Y/%M/%d')
将结果转换为基于给定格式的日期。 %M
是月份名称修改强>
select * from test
order by cast(
substring_index(substring_index(picture, '_', 2), '_', -1)
as unsigned
);
+--------+----------------------------------------+
| pid | picture |
+--------+----------------------------------------+
| 169799 | 2017/June/06/169799_1_jasfd;ads |
| 169799 | 2017/February/18/169799_2_jadsflkjasdf |
| 169799 | 2017/January/12/169799_3_iMbw7.jpg |
| 169799 | 2017/March/18/169799_4_iMbw7.jpg |
| 169799 | 2017/May/18/169799_5_jasfd;ads |
| 169799 | 2017/June/12/169799_10_jasfd;ads |
+--------+----------------------------------------+
<强>解释强>
substring_index(picture, '_', 2)
将按_
拆分文字并输出前2项substring_index(..., '_', -1)
选择最后一项,即数字<强>参考文献:强>
答案 2 :(得分:2)
您好,您可以做一个案例陈述,但我无法弄清楚您希望它订购的逻辑吗?它是文件名中间的1,2,3,4,5吗?您还可以使用正则表达式来查看这些数字并按顺序排序。虽然我不知道正常的表情。我给你的东西会起作用,但它不是最好的答案,因为它在查询中有很多性能不佳的开销。
order by
(Case when picture like '%_1_%' then '1'
when picture like '%_2_%' then '2'
when picture like '%_3_%' then '3'
when picture like '%_4_%' then '4'
when picture like '%_5_%' then '5' else '0' end)
只需继续添加您希望它排序的顺序,具体取决于前进的数量,但这可能会导致查询中的大量开销并花费一些时间。不确定正则表达式解析掉下划线后的数字的速度有多快。所以性能可能是我的答案的问题。
答案 3 :(得分:1)
在SQL的几乎所有方言中,您都可以执行以下操作:
order by
to_number(
substr(
picture,
instr(picture,'_',1,1)+1,
instr(picture,'_',1,2) - instr(picture,'_',1,1) -1))
SQL的一些方言(不确定mysql)提供了更友好的分隔字符串解析功能,例如: “split_part()”,这将支持更紧凑:
order by to_number(split_part(picture,'_',2))