数据库中的字母数字排序/排序


Alphanumeric sorting/ordering from database

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

A1、A10、A12、A2、A5、A8

有没有正确排序的方法?像

A1、A2、A5、A8、A10、A12

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

 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"]);});

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

MySQL没有内置的自然排序功能。
针对这个问题列出了各种选项:MySQL中的自然排序。。。但没有什么能轻易做到你想要的。

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

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

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

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

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

ORDER BY LENGTH(column), column
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;
});

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