MySQL の指定文字によるマージと分割の例のチュートリアル

MySQL の指定文字によるマージと分割の例のチュートリアル

序文

指定した文字による結合または分割は一般的なシナリオです。MySQL では結合の記述は比較的簡単ですが、指定した文字による分割は比較的面倒です (つまり、より多くの文字を記述する必要があります)。この記事では、指定された文字に従って結合および分割する方法を示す例を示します。

1. 合併

MySQL データベースでは、group_concat を使用して、指定された文字に従ってデータを結合できます。

テストテーブルを作成する

mysql> テーブル tb_group(id int auto_increment primary key ,col1 varchar(20)) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

テストデータを挿入

mysql> tb_group(col1) に値 ('a'),('c'),('dddd'),('ewdw'),('vxgdh'); を挿入します。
クエリは正常、5 行が影響を受けました (0.01 秒)
記録: 5 重複: 0 警告: 0

col1フィールドの内容をマージする

デフォルトでは、それらはコンマで結合されます。例:

mysql> tb_group から group_concat(col1) を選択します。 
+---------------------+
| グループ連結(col1) |
+---------------------+
| a、c、dddd、ewdw、vxgdh |
+---------------------+
セット内の1行(0.01秒)

マージする区切り文字を指定します。たとえば、|| 記号を使用してマージすることを指定します。

mysql> tb_group から group_concat(col1,'||') を選択します。 
+---------------------------------+
| グループ連結(col1,'||') |
+---------------------------------+
| a||、c||、dddd||、ewdw||、vxgdh|| |
+---------------------------------+
セット内の 1 行 (0.00 秒)

知らせ

デフォルトでは、合計長さは 1024 を超えることはできません。超えると、結果は切り捨てられます。

例えば、データを挿入するスクリプトを書くと、

# シェルスクリプトを使用して vim test_insert.sh を実装する
# 次の内容を追加します #!/bin/bash
#gjc

{1..1025} 内の i について
する
 mysql -uroot -p'123456' --socket=/data/mysql3306/tmp/mysql.sock -e "testdb.tb_group1(col1)values('a') に挿入"
終わり

# データを挿入するスクリプトを実行します sh test_insert.sh
mysql> tb_groupからcount(*)を選択します。
+----------+
| カウント(*) |
+----------+
| 1030 |
+----------+
セット内の 1 行 (0.00 秒)

再度マージ

mysql> tb_group\G から group_concat(col1)cols、length(group_concat(col1)) col_len を選択します。
************************** 1. 行 ****************************
 Cols:A、C、DDDD、EWDW、VXGDH、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A。 a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a 、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、
列の長さ: 1024
セットに1行、警告2回(0.01秒)

結果の合計バイト長は1024バイトしかないことがわかります。

この状況では、実際の使用では明らかに満足できません。どうすれば解決できるでしょうか?実際、この長さはMySQLデータベースのgroup_concat_max_lenパラメータに直接関係しています(デフォルトは1024です)

mysql> 'group_concat_max_len' のようなグローバル変数を表示します。
+----------------------+-------+
| 変数名 | 値 |
+----------------------+-------+
| グループ連結最大長 | 1024 |
+----------------------+-------+
セット内の1行(0.08秒)

パラメータを調整してみましょう。

/* すべての新しい接続が有効になるようにグローバルパラメータを変更します*/
mysql> グローバル group_concat_max_len=102400 を設定します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

/* 現在の接続を終了せずに有効にできるようにセッションパラメータを変更します*/
mysql> セッション group_concat_max_len=102400 を設定します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

mysql> 'group_concat_max_len' のようなグローバル変数を表示します。
+----------------------+--------+
| 変数名 | 値 |
+----------------------+--------+
| グループ連結最大長 | 102400 |
+----------------------+--------+
セット内の 1 行 (0.00 秒)

mysql> 'group_concat_max_len' のような変数を表示します。
+----------------------+--------+
| 変数名 | 値 |
+----------------------+--------+
| グループ連結最大長 | 102400 |
+----------------------+--------+
セット内の1行(0.01秒)

もう一度マージしてみましょう。

mysql> tb_group\G から group_concat(col1)cols、length(group_concat(col1)) col_len を選択します。
************************** 1. 行 ****************************
 Cols:A、C、DDDD、EWDW、VXGDH、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A。 a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a、a 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、 、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、A、
列長: 2069
セット内の1行(0.01秒)

これは正しい結果です。したがって、本番環境ではこのパラメータを適切なサイズに調整することをお勧めします。

(ヒント: Oracle データベースでこれを実装するには、listagg や wm_concat などの方法を使用できます。また、比較的シンプルで、自分でテストすることもできます)

2. 分割

文字列を指定された文字で分割することも一般的なシナリオです。ただし、MySQL データベースでの文字列分割は他のデータベースほど便利ではなく (他のデータベースには直接分割関数があります)、実装を支援するために mysql ライブラリの mysql.help_topic テーブルの助けが必要です。以下にいくつか例を挙げます。

テストテーブルとデータを作成する

mysql> テーブル tb_split(id int primary key auto_increment,col1 varchar(20)) を作成します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> tb_split(col1) に値 ('a,b,c,d'),('c,a,g,h') を挿入します。
クエリは正常、2 行が影響を受けました (0.01 秒)
記録: 2 重複: 0 警告: 0

カンマで区切る

mysql> SELECT a.id, substring_index(substring_index(a.col1, ',', b.help_topic_id + 1), ',',- 1) NAME FROM tb_split a JOIN mysql.help_topic b ON b.help_topic_id < (length(a.col1) - length(REPLACE(a.col1, ',', '')) + 1);
+----+------+
| ID | 名前 |
+----+------+
| 1 | へ |
| 1 | バ |
| 1 | 1 |
| 1 | 日 |
| 2 | へ |
| 2 | 1 |
| 2 | グラム |
| 2 | 時間 |
+----+------+
セット内の行数は 8 です (0.00 秒)

これにより分割が実現します。

指定した文字で分割

別の区切り文字の場合は、Ruiyang の区切り文字フィールドを変更するだけです。

mysql> tb_split(col1) に値('a|v|f') を挿入します。
クエリは正常、1 行が影響を受けました (0.00 秒)

mysql> tb_split から * を選択します。
+----+---------+
| id | 列1 |
+----+---------+
| 1 | a、b、c、d |
| 2 | c、a、g、h |
| 3 | a|v|f |
+----+---------+
セット内の 3 行 (0.01 秒)

mysql> SELECT a.id, substring_index(substring_index(a.col1, '|', b.help_topic_id + 1), '|',- 1) col_split FROM tb_split a JOIN mysql.help_topic b ON b.help_topic_id < (length(a.col1) - length(REPLACE(a.col1, '|', '')) + 1) ここで、a.id=3;
+----+-----------+
| id | 列分割 |
+----+-----------+
| 3 | を |
| 3 | ヴ |
| 3 | フ |
+----+-----------+
セット内の 3 行 (0.00 秒)

これで、指定した文字に応じた結合と分割が完了します。

3. 結論

この記事では、MySQL の一般的なマージと分割の方法を紹介します。SQL の書き方が得意な学生は、他の方法を使用して、権限不足のニーズを解決することもできます (たとえば、分割時に MySQL ライブラリの help_topic テーブルに対する権限が必要です)。

これで、MySQL の指定文字によるマージと分割に関する記事は終了です。MySQL の指定文字によるマージと分割の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL 文字列分割の例 (区切り文字なしの文字列抽出)
  • MySQL 文字列分割操作 (区切り文字を含む文字列のインターセプション)
  • MySQL テーブルの垂直分割と水平分割
  • MySQL インターセプションと文字列分割関数の使用例
  • MYSQL データベースのデータ分割の概要: サブライブラリとサブテーブル
  • MySQLの一般的なデータ分割方法
  • Perlを使用してデータテーブル(MySQL)を分割し、データインスタンスを移行する
  • mysqlはコンマに基づいてデータ行を複数の行に分割します

<<:  Vue2.0/3.0 での provide と inject の使用例

>>:  Linux サーバー上で複数の SVN リポジトリを構成するプロセスの詳細な説明

推薦する

MySQL Routerのインストールと展開

目次01 MySQLルーターの紹介MySQL Router とは何ですか? 02 MySQLルータの...

Vue で PC アドレスをモバイル アドレスにリダイレクトする方法

要件:PC側とモバイル側は2つの独立したプロジェクトです。2つのプロジェクトの内容は基本的に同じで、...

IE6 の select を div でカバーできないバグの解決方法

div を使用してマスクを作成したり、ポップアップ ウィンドウをシミュレートしたりします。ただし、I...

Windows Server 2016 に Docker をインストールする方法

最近、Microsoft は Docker をネイティブにサポートする Windows Server...

Centos7 DockerでNginxファイルを変更するプロセスの詳細な説明

1. docker に nginx をインストールします。 docker に Nginx をインスト...

加算、減算、乗算、除算の機能を実現するには、HTML に 2 つの数値を入力します。

1. parseFloat() 関数Web ページ上に簡単な計算機を作成し、テキスト ボックスに ...

MySQL 日付処理関数の例の分析

この記事は主にMySQLの日付処理関数のサンプル分析を紹介します。この記事ではサンプルコードを詳細に...

CentOS 7 に MySQL 8.0.20 データベースをインストールするための詳細なチュートリアル

関連記事: MySQL8.0.20 インストール チュートリアルとインストールの問題に関する詳細なチ...

MySQL トランザクション分析

取引トランザクションはビジネス ロジックの基本単位です。各トランザクションは一連の SQL ステート...

Idea で Docker を使用して SpringBoot プロジェクトをデプロイする詳細な手順

序文プロジェクト要件: Dockeridea に Docker プラグインをインストールし、Dock...

HTML は Double 11 クーポン取得を実装します (クーポン取得ページを開く時間を設定します)

さっそく、コードを直接投稿します。具体的なコードは次のとおりです。 <!DOCTYPE htm...

Vueはボトムクエリ関数を実装します

この記事では、ボトムクエリ機能を実装するためのVueの具体的なコードを例として紹介します。具体的な内...

MySQL の複数テーブル関連付け 1 対多クエリを使用して最新のデータを取得する方法の例

この記事では、MySQL で複数のテーブルを使用して 1 対多のクエリを使用して最新のデータを取得す...

CSS でより美しいリンクプロンプト効果をカスタマイズする方法

提案: コードをできるだけ手書きすると、学習の効率と深さを効果的に向上できます。デフォルトでは、&l...

jQueryでフルスクリーンスクロール効果を実現

この記事の例では、フルスクリーンスクロールを実現するためのjQueryの具体的なコードを参考までに共...