按列中的特定字符串排序SQL

时间:2017-06-06 03:24:53

标签: mysql sql

我最近的任务是根据特定的字符串按顺序放置一列。贝娄是我桌子的截图:

enter image description here

如何按以下顺序对图片列进行排序:

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",它将定义图像的排序编号。

4 个答案:

答案 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))