【问题标题】:Alphanumeric sorting/ordering from database来自数据库的字母数字排序/排序
【发布时间】:2013-07-18 04:51:11
【问题描述】:

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

A1、A10、A12、A2、A5、A8

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

A1、A2、A5、A8、A10、A12

【问题讨论】:

标签: php mysql


【解决方案1】:

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

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

【讨论】:

    【解决方案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 中的排序之后完成,这对于大型数据集很快就会变得低效。

    【讨论】:

    • 效果很好,但请注意,这会阻止您在排序上使用LIMIT。您确实需要获取 所有 数据来对其进行排序。
    【解决方案3】:

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

    ORDER BY LENGTH(column), column
    

    【讨论】:

      【解决方案4】:
      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;
      });
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-06-05
          • 2015-06-22
          • 1970-01-01
          • 2014-05-05
          • 2013-10-05
          • 2022-06-13
          • 1970-01-01
          相关资源
          最近更新 更多