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

时间:2013-07-18 04:51:11

标签: php mysql

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

A1,A10,A12,A2,A5,A8

有没有办法正确排序?像

A1,A2,A5,A8,A10,A12

5 个答案:

答案 0 :(得分:5)

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

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

fiddle here

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

usort($records, function($a, $b){return strnatcasecmp($a["fieldname"], $b["fieldname"]);});

答案 1 :(得分:2)

这称为natural sort, or a natural order

MySQL没有内置的自然排序功能 回答这个问题时列出了各种选项:Natural Sort in 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中进行排序后必须进行任何限制或分页,这对于使用大型数据集会很快变得低效。

答案 2 :(得分:1)

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

ORDER BY LENGTH(column), column

答案 3 :(得分: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;
});

答案 4 :(得分:0)

使用natsort()。这对字母数字值非常有效。