検索
ホームページデータベースmysql チュートリアルMySQL における真の英数字 / 自然ソート – 答えが常に再帰になるのはなぜですか?

True Alphanumeric / natural sorting in MySQL - why is the answer always recursion?

昨日、MySQL で英数字のソートを解決しようとして失敗しました。 (その記事はここで読んでください)

私は実際にそれに近づいたし、正しいコンセプトを持っていましたが、実行が間違っていただけです。

今日、私は目が覚めてひらめきを経験しました...再発しました。

再帰の問題は、再帰を実行するには再帰を理解しなければならないことです...そして、MySQL で再帰を実行できるほど再帰について理解していません。

ただし、Chat Gippity を少し行ったり来たりして (つまり、私が要求した内容を書き込ませ、要求した内容の約 25% を返し、修正して新しいチャットにフィードするという意味です)約 2 時間同じことを繰り返します) 有効な答えが得られました!

要点まで

私の白鳥の歌、私の傑作、人生そのものへの答えを紹介してもいいでしょうか (わかりました、私がこれまで見た MySQL での真の英数字ソートに対する唯一の有効な解決策です)。

WITH RECURSIVE process_numbers AS (
    SELECT 
        data_value,
        data_value AS remaining_data,
        CAST('' AS CHAR(20000)) AS processed_data,
        1 AS iteration
    FROM test_data

    UNION ALL

    SELECT
        data_value,
        CASE 
            WHEN LOCATE(REGEXP_SUBSTR(remaining_data, '[0-9]+'), remaining_data) > 0 THEN
                SUBSTRING(
                    remaining_data,
                    LOCATE(REGEXP_SUBSTR(remaining_data, '[0-9]+'), remaining_data)
                    + LENGTH(REGEXP_SUBSTR(remaining_data, '[0-9]+'))
                )
            ELSE '' 
        END AS remaining_data,

        CONCAT(
            processed_data,
            CASE 
                WHEN LOCATE(REGEXP_SUBSTR(remaining_data, '[0-9]+'), remaining_data) > 0 THEN
                    LEFT(remaining_data, LOCATE(REGEXP_SUBSTR(remaining_data, '[0-9]+'), remaining_data) - 1)
                ELSE remaining_data
            END,
            CASE
                WHEN REGEXP_SUBSTR(remaining_data, '[0-9]+') IS NOT NULL THEN
                    RIGHT(CONCAT('0000000000', REGEXP_SUBSTR(remaining_data, '[0-9]+')), 10)
                ELSE ''
            END
        ) AS processed_data,

        iteration + 1
    FROM process_numbers
    WHERE LENGTH(remaining_data) > 0
          AND iteration 



<p>そして、それを試してみたい (そしてそれを壊してみたい) 場合は、この DB フィドルで遊ぶことができます</p>

<h2>
  
  
  では、これはどのように機能するのでしょうか?
</h2>

<p>これは私が当初やりたかったことを実行し、すべての数値グループを取得して合計 10 桁になるように埋め込みます。</p>

<p>したがって、これに 11 桁の連続する数値を含むいくつかの文字列を入力すると、調整なしでは動作しませんが、それ以外は正常に動作します!</p>

<p>ご存知のとおり、MySQL は辞書編集モードであっても数値を正しく並べ替えることができますが、欠点が 1 つあります。</p>

<p>一度に 1 文字ずつ (効率的に) ソートするため、「11」は「2」より小さいものとしてカウントされます。したがって、「2」は「1」より大きいため、最初に来ます。次に、次の文字をチェックします。この時点で (少なくとも数値に関しては) 並べ替えが正しくありません。 </p>

<p>これをよりよく理解するには、1 が実際に文字「b」で、2 が文字「c」だったらと想像してください。 </p>

<p>これが MySQL が数字を「認識」する方法であり、数字は単なる文字の 1 つです。</p>

<p>つまり、「bb」と「c」がある場合、「bb」が「c」の前に来ると<em>期待できます</em>。ここで数字を入れ替えて元に戻すと、「11」が「2」の前に来る理由がわかります。</p>

<h3>
  
  
  それで、これはハッキングですか?
</h3>

<p>はい、パディングを通じて数値を「後方」に移動することで問題を解決します。</p>

<p>例に戻ると、「11」と「2」の長さを 3 にパディングし、「a」を 0 として使用すると、次のようになります。<br>
</p>

<pre class="brush:php;toolbar:false">011 = abb
002 = aac 

並べ替えがどのように行われるかに注目してください:

  • 文字 1: 「a」は「a」より大きいです - いいえ、それらは同じです。
  • 文字 2: "b" は "a" より大きい - はい、"a" を "b" の前に置きます
  • 文字 3: は現在は無関係であり、以前とは異なり、より大きい出現がすでに見つかりました。

そのロジックにより、次のようになります:

002 = aac (the second "a" comes before the second "b" in the next row)
011 = abb

これが仕組みです!

再帰について説明するつもりですか?

なんだか。私はこれについて「家を一周」しており、私の知識は表面レベルですが、試してみるつもりです。

問題は、MySQL で RegEx がどのように動作するかにありました。 REGEX_SUBSTR は、一致を 1 つだけ見つけて、他の一致が見つかるたびにその一致を返し続けます。昨日のソリューションが正しく機能しなかったのはそのためです。

しかし、REGEX_REPLACE には、一致する文字列の長さを正しく公開していないように見えるという独自の問題があります (そのため、正しく LPAD することができません)

それが、私が答えとして再帰について考えた理由です。

REGEX_SUBSTR を使用すると、正しいパディング動作を取得できます。また、RegEx を介した各ループは基本的に新しい関数呼び出しであるため、前の一致を「記憶」しないため、この問題は解決されます。

ロジックを簡単に理解したい場合は、実際は見た目ほど怖くないです!

  • 指定された文字列をループして、数値 (単一の文字だけでなく数値全体) を探します。
  • その後、それを Remaining_data から削除して、再び一致しないようにします。
  • 先ほど一致させた数値を取得し、合計 10 桁になるように埋め込みます。
  • 次に、文字列内の次の数値部分を検索し、このプロセスを繰り返し、最終的な文字列としてprocessed_dataを構築します。
  • 最後に、処理する数値がなくなったら、残りの文字をprocessed_dataの末尾に追加して変換を完了し、これをsort_keyとして返します。

その後、クエリでこの sort_key を使用して、列を正しく並べ替えることができます。

反復部分は純粋に保護ツールであり、十分に複雑な文字列が処理された場合 (または、ロジックにエラーがあった場合) に MySQL サーバーがメモリ不足で完全に実行されたり、クエリがクラッシュしたりしないようにするためのものです。それは永遠に繰り返されるでしょう)。

それはラップです!

物事について寝ていると新しい視点が生まれるのは面白いと思いませんか?

毎日 2 ~ 3 倍の頻度で問題に取り組み、10 倍の開発者になれるように、多相睡眠を試してみるべきでしょうか?はは。

とにかく、かなり堅牢な真の英数字ソートができました。

ああ、実際には、GENERATE またはストアド プロシージャを使用して、sort_key をデータベース上のストアド列に変換する必要があるでしょう。悲しいことに、私が使っている遊び場はそれをサポートしていないようです。そして今日は日曜日なので、それはあなたに任せます、親愛なる視聴者!

週末の休息と素晴らしい一週間をお過ごしください。

以上がMySQL における真の英数字 / 自然ソート – 答えが常に再帰になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
MySQLで利用可能なさまざまなストレージエンジンは何ですか?MySQLで利用可能なさまざまなストレージエンジンは何ですか?Apr 26, 2025 am 12:27 AM

mysqloffersvariousstorageEngines、それぞれのfordifferentusecases:1)Innodbisidealforapplicationsingingidcomplianceanceandhighconcurrency、support transactions andforeignkeys.2)myisamisbestforread-havyworkloads、transactionsupptort.3)

MySQLの一般的なセキュリティの脆弱性は何ですか?MySQLの一般的なセキュリティの脆弱性は何ですか?Apr 26, 2025 am 12:27 AM

MySQLの一般的なセキュリティの脆弱性には、SQLインジェクション、弱いパスワード、不適切な許可構成、および非合事ソフトウェアが含まれます。 1。SQL注射は、前処理ステートメントを使用することで防ぐことができます。 2。強力なパスワード戦略を強制的に使用することにより、弱いパスワードを回避できます。 3.不適切な許可構成は、ユーザー許可の定期的なレビューと調整を通じて解決できます。 4.未使用のソフトウェアは、MySQLバージョンを定期的にチェックして更新することでパッチを適用できます。

MySQLでスロークエリをどのように識別できますか?MySQLでスロークエリをどのように識別できますか?Apr 26, 2025 am 12:15 AM

MySQLの遅いクエリを識別することは、遅いクエリログを有効にし、しきい値を設定することで実現できます。 1.スロークエリログを有効にし、しきい値を設定します。 2.スロークエリログファイルを表示および分析し、詳細な分析のためにMySQLDumpSlowやPT-Query-Digestなどのツールを使用します。 3.インデックスの最適化、クエリの書き換え、およびselect*の使用を回避することで、遅いクエリの最適化を実現できます。

MySQLサーバーの健康とパフォーマンスをどのように監視できますか?MySQLサーバーの健康とパフォーマンスをどのように監視できますか?Apr 26, 2025 am 12:15 AM

MySQLサーバーの健康とパフォーマンスを監視するには、システムの健康、パフォーマンスメトリック、クエリの実行に注意する必要があります。 1)システムの健康を監視する:Top、HTOP、またはShowGlobalStatusコマンドを使用して、CPU、メモリ、ディスクI/O、ネットワークアクティビティを表示します。 2)パフォーマンスインジケーターの追跡:クエリ番号あたりのクエリ番号、平均クエリ時間、キャッシュヒット率などのキーインジケーターを監視します。 3)クエリ実行の最適化を確保します:スロークエリログを有効にし、実行時間が設定されたしきい値を超えるクエリを記録し、最適化します。

mysqlとmariadbを比較対照します。mysqlとmariadbを比較対照します。Apr 26, 2025 am 12:08 AM

MySQLとMariaDBの主な違いは、パフォーマンス、機能、ライセンスです。1。MySQLはOracleによって開発され、Mariadbはフォークです。 2. Mariadbは、高負荷環境でパフォーマンスを向上させる可能性があります。 3.MariaDBは、より多くのストレージエンジンと機能を提供します。 4.MySQLは二重ライセンスを採用し、MariaDBは完全にオープンソースです。既存のインフラストラクチャ、パフォーマンス要件、機能要件、およびライセンスコストを選択する際に考慮する必要があります。

MySQLのライセンスは、他のデータベースシステムと比較してどうですか?MySQLのライセンスは、他のデータベースシステムと比較してどうですか?Apr 25, 2025 am 12:26 AM

MySQLはGPLライセンスを使用します。 1)GPLライセンスにより、MySQLの無料使用、変更、分布が可能になりますが、変更された分布はGPLに準拠する必要があります。 2)商業ライセンスは、公的な変更を回避でき、機密性を必要とする商用アプリケーションに適しています。

MyisamよりもInnodbを選びますか?MyisamよりもInnodbを選びますか?Apr 25, 2025 am 12:22 AM

Myisamの代わりにInnoDBを選択する場合の状況には、次のものが含まれます。1)トランザクションサポート、2)高い並行性環境、3)高いデータの一貫性。逆に、Myisamを選択する際の状況には、1)主に操作を読む、2)トランザクションサポートは必要ありません。 INNODBは、eコマースプラットフォームなどの高いデータの一貫性とトランザクション処理を必要とするアプリケーションに適していますが、Myisamはブログシステムなどの読み取り集約型およびトランザクションのないアプリケーションに適しています。

MySQLの外国キーの目的を説明してください。MySQLの外国キーの目的を説明してください。Apr 25, 2025 am 12:17 AM

MySQLでは、外部キーの機能は、テーブル間の関係を確立し、データの一貫性と整合性を確保することです。外部キーは、参照整合性チェックとカスケード操作を通じてデータの有効性を維持します。パフォーマンスの最適化に注意し、それらを使用するときに一般的なエラーを避けてください。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター