2

要按名称订购,我正在使用'order by name'

但名称包含双冒号:'::'

如何按双冒号后面的文本排序?

所以 :

aaaa::bbbb
aaaa::aaaa
aaaa::1234
aaaa::a1234

将被订购:

aaaa::1234
aaaa::aaaa
aaaa::a1234
aaaa::bbbb
4

5 回答 5

2

按子字符串排序并使用locate来查找它的开始位置:

order by substring(name, locate('::', name) + 3, 30)

由于不使用索引,因此会降低性能。

于 2012-06-15T11:11:58.307 回答
0

您必须在 MySQL 中创建一个新字段,然后将文本的第二部分插入其中。排序方式使用各种索引和算法(例如分治法)。

因此,它不适用于对特定字符串的特定部分进行排序,并且如果您确实设法“伪造”了一种这样做的方式,那么由于缺少索引,性能会很糟糕。

抱歉,我意识到这可能不是您要寻找的答案,但恐怕最好的方法是稍微长一点的方法,但是如果您向其中添加索引,至少您可以以极快的速度进行操作:)

于 2012-06-15T11:02:01.610 回答
0

您必须将文本分成两列并按后一列排序。您可以在应用程序代码中拆分和连接列,也可以使用视图和存储过程使其看起来像数据库客户端的一列。

于 2012-06-15T11:02:58.007 回答
0

您可以尝试以下方法

  1. 获取所有数据为字母的所有记录::

    联盟

  2. 获取所有数据在 :: 之后为数字的所有记录

于 2012-06-15T11:32:05.793 回答
0

关于您的排序,根据 ascii 值,数字排在字母之前,所以 aaaa:1234 应该排在第一位

您可以在 PHP 中检索值和排序

纳夫索特

<?php
$arr = array("aaaa::bbbb","aaaa::aaaa","aaaa::1234","aaaa::a1234");

$sec=$arr;
natsort($sec);

print_r ($sec);

?>
于 2012-06-15T12:22:03.923 回答