mysql - 按字符串中的数字对现有数据库进行排序

标签 mysql sql string numbers

这有点像一场噩梦。我正在开发现有数据库的前端,并且我必须跳过重重困难才能确保数据以正确的顺序显示。如果我可以仅按 Id 进行排序,那么我的生活会变得更加简单,但 Id 与数据几乎没有相关性。

这就是我的意思

ID   DATA
357  "7-1-5: Sensitive Information I can't share"
2521 "30-2-8-17: Yet more sensitive Information"
6002 "9-30: There's a 10 behind the colon, because I hate you"
8999 "2-2-4: This was populated in no particular order"
9001 "30-3: More Info."

我正在尝试像这样排序

ID   DATA 
0001 "2-2-4: This was populated in no particular order"
0002 "7-1-5: Sensitive Information I can't share"
0003 "9-30: There's a 10 behind the colon, because I hate you"
0004 "30-2-8-17: Yet more sensitive Information"
0005 "30-3: More Info."

基本上,我需要它一次又一次地按破折号分隔的每个 1 到 2 位数字进行排序,以便 1-3 位于 1-2-1 之后,1-2-1 位于 1-1-50 之后。

就像我一开始说的,我是一名前端人员,所以在 MySql 中执行东西比我一个人能做的更多。任何帮助将不胜感激。

编辑:我刚刚意识到一个单独的表中有外键指向这个表,这让事情变得更糟。

最佳答案

尝试这个查询:

SELECT col
FROM yourTable
ORDER BY SUBSTRING(col, INSTR(col, '"') + 1, INSTR(col, ':') - INSTR(col, '"') - 1)

ORDER BY 子句中的 SUBSTRING(...) 术语仅从文本中提取 id。大概您希望它们按数字顺序从左到右排序。即使它们是 varchar,数字排序仍然可以工作。

对于您的示例数据,这会产生以下输出:

ID 8999 DATA "2-2-4: This was populated in no particular order"
ID 2521 DATA "30-2-8-17: Yet more sensitive Information"
ID 357  DATA "7-1-5: Sensitive Information I can't share"
ID 6002 DATA "9-30: There's a 10 behind the colon, because I hate you"

在撰写本答案时,Fiddle 已关闭,但我在 MySQL Workbench 中测试了该查询,它似乎运行良好。

编辑:

如果您想为每条记录分配一个新的 ID,您可以创建一个新表 (newTable),其中的 ID 列会自动递增。然后,您可以使用 INSERT INTO ... SELECT 以及上述 ORDER BY 逻辑来填充表。 ID 字段应由 MySQL 自动递增。

INSERT INTO newTable (`id`, `col`)
SELECT NULL, col
FROM yourTable
ORDER BY SUBSTRING(col, INSTR(col, '"') + 1, INSTR(col, ':') - INSTR(col, '"') - 1)

关于mysql - 按字符串中的数字对现有数据库进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38616524/

相关文章:

sql - Presto:将 array<struct<key:string,value:array<string>>> 转换为 map<string,array<string>>

sql - 我在转换/转换 GetDate()[3] 的 dw 日期部分时遇到问题,以便我可以在字符串 [1,3,5] 中找到它

android - Noob 有多个安卓问题

带有 '=' 的 Mysql 查询比 'LIKE' 慢很多

php - MySQL需要单独创建索引吗?

php - 无法在 Yii 的连接表中插入记录

sql - Redshift 提取两个模式之间的字符串 (regexp_substr)

python - 在每个字符串中标记(分割?)数据集的最佳方法

没有分配的 C++ 索引到字符串映射

PHP 使用 GET 重定向