0

在数据库中,它存储 A1、A2、A10、A12、A5、A8 的值,但是当我检索它时,它显示如下:-

A1、A10、A12、A2、A5、A8

有没有办法正确排序?喜欢

A1、A2、A5、A8、A10、A12

4

5 回答 5

5

如果字符串总是以单个字母/数字前缀开头,那么您可以使用

 SELECT no from my_table order by substring(no,1,1), substring(no,2)+0 

在这里摆弄

在 PHP 中,您可以通过使用usort返回字段上的strnatcasecmp调用的结果来对多维数组进行排序。

usort($records, function($a, $b){return strnatcasecmp($a["fieldname"], $b["fieldname"]);});
于 2013-07-18T04:57:23.177 回答
2

这称为自然排序或自然顺序

MySQL 没有进行自然排序的内置能力。
在回答这个问题时列出了各种选项:MySQL 中的自然排序......但没有什么能轻松满足您的需求。

不过,您可以做的是将所有数据返回给 PHP,并使用该natsort()函数在那里进行排序。

$vals = array('A1', 'A10', 'A12', 'A2', 'A5', 'A8');
natsort($vals);
print_r($vals); // A1, A2, A5, A8, A10, A12

usort()这只是对单个值进行排序 - 但如果您需要对整行进行排序,您可以使用with函数获得相同的strnatcmp()功能

请注意,这需要您获取所有行以便对它们进行排序 - 任何限制或分页都必须在 PHP 中的排序之后完成,这对于大型数据集来说很快就会变得低效。

于 2013-07-18T04:57:33.353 回答
1

如果前缀总是相似的,你可以先按长度排序?

ORDER BY LENGTH(column), column
于 2013-07-18T04:58:42.387 回答
0

使用natsort()。这适用于字母数字值。

于 2019-11-14T06:30:55.843 回答
0
Array
(
    [1] => Array
        (
            [thumb] => oiuy
        )

    [1a] => Array
        (
            [thumb] => asdf
        )

    [1b] => Array
        (
            [thumb] => 2345
        )
)

uksort($array, function($a, $b) {

    sscanf($a, '%d%s', $an, $as);
    sscanf($b, '%d%s', $bn, $bs);

    if($an == $bn)
        return strcmp($as, $bs);

    return $an - $bn;
});
于 2016-07-13T19:07:44.350 回答