3

私は台帳アプリケーションを開発しています。私の主な問題は、クライアントがこのようなコードを含む勘定科目表を持っていることです

1.1.1, 
1.1.2 
...... 
1.1.10, 
1.1.11,
.........

PHPまたはMySQlを使用すると、それらをソートすることしかできません

1.1.1, 
1.1.10, 
1.1.11,
1.1.2, 
.......

1.1.9 の後に 1.1.10 が来るように並べ替える方法について何か助けはありますか?

前もって感謝します。

4

6 に答える 6

3

これは醜いですが、うまくいきます:

ORDER
   BY SUBSTRING_INDEX(CONCAT( col ,'.'),'.',1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',2),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',3),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',4),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',5),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',6),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',7),'.',-1) + 0

これらの式をテストするには、それらを SELECT で使用して、正しいコンポーネントが抽出され、正しく順序付けされていることを確認します。

SELECT col
     , SUBSTRING_INDEX(CONCAT( col ,'.'),'.',1) + 0 AS p1
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',2),'.',-1) + 0 AS p2
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',3),'.',-1) + 0 AS p3
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',4),'.',-1) + 0 AS p4
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',5),'.',-1) + 0 AS p5
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',6),'.',-1) + 0 AS p6
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',7),'.',-1) + 0 AS p7
  FROM mytable 
 ORDER BY 2,3,4,5,6,7,8

これがどのように機能するかを説明するのではなく、重要な「トリック」を紹介します。

  • 末尾に「.」を追加します。列の最後に、最後の位置に何度も戻らないようにする必要があります。

  • SUBSTRING_INDEX を使用して、n 番目の「.」までの部分を取得します。

  • SUBSTRING_INDEX を使用して、その末尾部分を取得します (先頭のドットまで逆方向に読み取ります)。

  • ゼロを追加して、文字列を数値に変換します

于 2013-07-25T04:46:46.587 に答える
2

値を配列に割り当て、natsort()を使用して値を自然に並べ替えます。

$foo = array ('1.1.1', '1.1.2', '1.1.10', '1.1.11');
natsort ($foo);
print_r ($foo);

/*
Array
(
    [0] => 1.1.1
    [1] => 1.1.2
    [2] => 1.1.10
    [3] => 1.1.11
)
*/

?>
于 2013-07-25T04:28:17.367 に答える
2

小数の間の数字を引き出して、数値として扱う必要があります。SUBSTRING_INDEX数字を引き出してCAST数値に変換するために使用します。

SELECT *
FROM myAccounts
ORDER BY
  CAST(SUBSTRING_INDEX(account_number, '.', 1) AS UNSIGNED),
  CAST(SUBSTRING_INDEX(account_number, '.', -2) AS UNSIGNED),
  CAST(SUBSTRING_INDEX(account_number, '.', -1) AS UNSIGNED)
于 2013-07-25T04:29:03.077 に答える
0

同様の問題があり、次のように管理しました。

SELECT .... , CAST(SUBSTRING([column_name],1) AS UNSIGNED) AS myNum,  CAST(SUBSTRING([column_name],3) AS UNSIGNED) AS myDec
FROM ...
WHERE ...
ORDER BY myNum, myDec

あなたの場合、追加の「深さ」が必要になるかもしれません。これが洞察を得るのに役立つことを願っています。

于 2013-07-25T04:33:05.410 に答える
0

ソートフィールドがname次のORDER BY句を使用する場合

ORDER BY length(name), name
于 2013-07-25T04:19:24.913 に答える