特定のシンボルで複数の行と列に分割するMySQLの例

特定のシンボルで複数の行と列に分割するMySQLの例

一部の障害コード テーブルでは、履歴またはパフォーマンス上の理由から、次の設計パターンが使用されます。つまり、複数の属性値が同じ行または列に格納されます。次の表の tonnly_error_record に示すように:


この場合、列をセミコロン「;」で分割して複数の行を形成し、次にコンマ「,」で分割して複数の列を形成することを検討できます。次の表に示すように:

ここに画像の説明を挿入

これは、MySQL の文字列分割関数を使用して実現できます。関数の説明は次のとおりです。

SUBSTRING_INDEX(文字列、区切り文字、カウント)   
-- str: 分割する文字列; delim: 区切り文字; count: 区切り文字の出現回数

最後に、具体的な実装は次のようになります。

#ステップ 1: セミコロン「;」に基づいて複数の行に分割 #ステップ 2: カンマ「,"」に基づいて複数の列に分割 select distinct S1.tbox_vin,
                (substring_index(substring_index(S1.error_code, ',', 1), ',', -1)) を spn として選択します。
                (substring_index(substring_index(S1.error_code, ',', 2), ',', -1) を選択) fmi、
                S1.変更時間
から (
         t1.tbox_vinを選択し、
                substring_index(substring_index(t1.dm1_string, ';', t2.help_topic_id + 1), ';', -1) を error_code として、
                t1.変更時間
         tonnly_error_record t1 から
                  mysql.help_topic t2に参加する
                       t2.help_topic_id < (length(t1.dm1_string) - length(replace(t1.dm1_string, ';', '')) + 1) の場合
         t1.dm1_string が null ではない
           かつ t1.dm1_string != '') S1
s1.error_code != '' の場合
  s1.error_codeはnullではない
S1.modify_time desc で順序付けします。

関連する知識ポイント

1. 文字列の分割: SUBSTRING_INDEX (str, delim, count)

1. パラメータの説明

パラメータ名説明する
str分割する文字列
デリム区切り文字、文字で区切る
カウントcount が正の数の場合、n 番目の区切り文字の前のすべての文字が取得されます。count が負の数の場合、末尾から n 番目の区切り文字の後のすべての文字が取得されます。

2. 例

(1)区切り文字として2番目のカンマ「,」より前の文字をすべて取得します。

SUBSTRING_INDEX('7654,7698,7782,7788',',',2)

獲取第2個以“,”逗號為分隔符之前的所有字符

(2)最後から2番目のカンマ区切り文字「,」以降のすべての文字を取得します。

SUBSTRING_INDEX('7654,7698,7782,7788',',',-2) 

獲取倒數第2個以“,”逗號分隔符之后的所有字符

2. 置換関数: replace(str, from_str, to_str)

1. パラメータの説明

パラメータ名説明する
str置換する文字列
文字列から置換する文字列
文字列置換する文字列

2. 例

(1)区切り文字「,」カンマを「」スペースに置き換えます。

REPLACE('7654,7698,7782,7788',',','')

將分隔符“,”逗號替換為“”空

3. 文字列の長さを取得する: LENGTH( str )

1. パラメータの説明

パラメータ名説明する
str置換する文字列
文字列から置換する文字列
文字列置換する文字列

2. 例 (1) 文字列 '7654,7698,7782,7788' の長さを取得する

長さ('7654,7698,7782,7788') 

獲取 '7654,7698,7782,7788' 字符串的長度

SQL解析を実装

選択 
    SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num 
から 
    mysql.ヘルプトピック 
どこ 
    help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

ここでは、MySQL ライブラリの help_topic テーブルの help_topic_id を変数として使用していますが、これは help_topic_id が自動インクリメントされるためです。もちろん、他のテーブルの自動インクリメント フィールドも補助として使用できます。

help_topic テーブル:

help_topic 表

実装手順:

ステップ 1:まず、最終的に分割する必要がある文字列の数を取得し、help_topic_id を使用して n 番目の文字列のトラバースをシミュレートします。

関係するコード スニペット:

help_topic_id < LENGTH('7654,7698,7782,7788')-LENGTH(REPLACE('7654,7698,7782,7788',',',''))+1

實現過程

ステップ 2: SUBSTRING_INDEX (str, delim, count) 関数を使用して、コンマ "," に基づいて文字列を分割し、結果を num フィールドに割り当てます。

関係するコード スニペット:

SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1) AS num

最初のステップ:

区切り文字としてカンマ「,」を使用し、help_topic_id の値に従って n+1 番目の区切り文字の前のすべての文字列をインターセプトします。 (ここで n+1 なのは、help_topic_id が 0 から始まり、ここでは最初の区切り文字から取得する必要があるためです。)

SUBSTRING_INDEX('7654,7698,7782,7788',',',ヘルプトピックID+1)

例えば:
help_topic_id = 0 の場合、取得される文字列 = 7654
help_topic_id = 1 の場合、取得される文字列 = 7654,7698
…(等々)

ステップ2:

区切り文字としてカンマ「,」を使用し、最後の区切り文字の後にあるすべての文字列を抽出します。

SUBSTRING_INDEX(SUBSTRING_INDEX('7654,7698,7782,7788',',',help_topic_id+1),',',-1)

例えば:
最初のステップによると、help_topic_id = 0の場合、取得された文字列 = 7654、この時点で2番目のステップで傍受された文字列 = 7654
最初のステップによると、help_topic_id = 1の場合、取得された文字列 = 7654,7698、この時点で2番目のステップで傍受された文字列 = 7698
…(等々)

最終的に以下の効果を達成することに成功しました〜

這里寫圖片描述

注: 区切り文字なしの文字列分割については、MySQL - 文字列分割 (区切り文字なしの文字列インターセプト) を参照してください。

MySQL を特定のシンボルで複数の行と列に分割する例についてはこれで終わりです。MySQL 固有のシンボル分割の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL で単一のフィールド内の複数の値を分割および結合する方法
  • MySql インポート CSV ファイルまたはタブ区切りファイル
  • Mysqlはストアドプロシージャを通じて文字列を配列に分割します
  • MySQL で SPLIT のような文字列分割関数を実装する

<<:  src 属性と href 属性の違い

>>:  js のループメソッドとさまざまなトラバーサルメソッド

推薦する

calc() で全画面背景の固定幅コンテンツを実現

ここ数年、Web デザインには「全幅背景と固定幅コンテンツ」というトレンドが生まれています。このデザ...

VMware 仮想マシンでの Centos8 ブリッジの静的 IP 設定方法

1. ネットワーク接続方法がブリッジされていることを確認する物理ネットワーク接続ステータスのコピーを...

Linux での nginx のインストール、展開、使用方法の詳細な説明

目次1. ダウンロード2. 展開3. Nginxログ関連の設定4. ファイルダウンローダーとして n...

Vue でクラスとスタイルを使用して v-bind バインディングを使用するいくつかの方法

要素にクラスを追加/削除することは、プロジェクト開発では非常に一般的な動作です。たとえば、Web サ...

MySQL ストアド関数の詳細な紹介

目次1. ストアド関数を作成する2. ストアド関数の呼び出し3. 保存された関数を削除する4. スト...

Docker に MySQL と Redis をインストールする方法

この記事はCentOS 7.3システム環境をベースに、MySQLとRedisのインストールと使用につ...

シームレスなカルーセルを実現するjQueryプラグイン

シームレス カルーセルは非常に一般的なエフェクトであり、ロジックを理解すれば非常に簡単です。効果は以...

Linux で Golang をインストールする方法

Go は、シンプルで信頼性が高く、効率的なソフトウェアを簡単に構築できるオープンソース プログラミン...

1つの記事でJavaScriptのクロージャ関数について学ぶ

目次変数のスコープ閉鎖の概念クロージャの使用クロージャのデメリット最後に、クロージャのメリットとデメ...

エレメントアバターアップロード練習

この記事は、Element公式サイトとQiniu Cloud公式サイトを使用しています。 eleme...

Docker環境でJenkinsを設定すると、タスクをビルドするときにコンソールログに文字化けした中国語の文字が表示されます

目次1. 問題の説明: 2. Jenkins設定のトラブルシューティング3. コードログのエンコード...

原因不明のMySqlサービス消失の解決策

原因不明のMySqlサービス消失の解決策先ほど、MySQL-Front が突然 MySql を開けな...

ドラッグアンドドロップによる並べ替えの詳細を実現する js

目次1. はじめに2. 実装3. HTML ドラッグ アンド ドロップ API を使用しないのはなぜ...

iframe なしの div ネスト HTML

最近、宿題をしているときに、iframe を使用せずにページをネストする必要があったため、jquer...

docker run後にコンテナがExited (0)と表示される問題を解決する

Centos7 上で openresty 用の Dockerfile を作成し、ビルドしました。 d...