这有点像一场噩梦。我正在开发现有数据库的前端,并且我必须跳过重重困难才能确保数据以正确的顺序显示。如果我可以仅按 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/