我有表前缀bok-
和inv-
id | number
1 | bok-1
2 | inv-3
3 | bok-2
4 | inv-2
5 | inv-10
6 | bok-3
它如何对number
前缀为的字段进行排序inv-
?
在这种情况下,结果将是:
id | number
1 | bok-1
2 | inv-1
3 | bok-2
4 | inv-2
5 | inv-3
6 | bok-3
我有表前缀bok-
和inv-
id | number
1 | bok-1
2 | inv-3
3 | bok-2
4 | inv-2
5 | inv-10
6 | bok-3
它如何对number
前缀为的字段进行排序inv-
?
在这种情况下,结果将是:
id | number
1 | bok-1
2 | inv-1
3 | bok-2
4 | inv-2
5 | inv-3
6 | bok-3
你可以只使用 MySQL 的SUBSTRING()
函数:
ORDER BY CAST(SUBSTRING(number, 5) AS SIGNED)
在sqlfiddle上查看。
但是,如果可能的话,最好将前缀和整数部分存储在单独的列中:
ALTER TABLE mytable
ADD COLUMN prefix ENUM('bok', 'inv'),
ADD COLUMN suffix INT;
UPDATE mytable SET
prefix = LEFT(number, 3),
suffix = SUBSTRING(number, 5);
ALTER TABLE mytable
DROP COLUMN number;
基本上你应该重新设计你的数据库结构。不幸的是,没有其他选项可以有效地处理这个问题,因为数据库不会在这些破折号上建立索引。因此,将两个字段分开是最常见的做法。否则,您将对每个 order by 子句运行表扫描。
编辑:除了讨论中的信息之外:https ://chat.stackoverflow.com/rooms/13241/discussion-between-eggyal-and-gusdecool很明显这是一个错误的设计和你的操作根本不应该执行请求。
如果不创建一个体面的结构,就不可能实现它,并且以这种方式创建一个合法的解决方案是不可能的。