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 リポジトリを構成するプロセスの詳細な説明

推薦する

Centos7 に Nginx 統合 Lua サンプル コードをインストール

序文私が使用しているパソコンはMacで、OSはmacOS Mojaveです。コンピュータに仮想マシン...

Maven で tomcat8-maven-plugin プラグインを使用する詳細なチュートリアル

オンラインで多くの記事を検索しましたが、解決策は見つかりませんでした。次のように、tomcat7-m...

Axios の二次カプセル化の例 プロジェクトのデモ

1. なぜパッケージングを行うのですか?全体的なコード呼び出し、リクエストの公開処理、パーソナライズ...

Pythonで書かれたWebアプリケーションをDockerでデプロイする実践

目次1. Dockerをインストールする2. コードを書く3. Dockerfileを書く4. 画像...

Linux カーネル デバイス ドライバー 高度な文字デバイス ドライバーのメモ

/****************** * 高度な文字デバイス ドライバー ***********...

ユーザーエクスペリエンスの要素またはWebデザインの要素

システムとユーザー環境の設計<br />Apple システムの成功は、そのシステム アー...

JavaScript は、マウスがテーブル行を通過するときに色の識別を実装します。

この記事では、マウスがテーブルの行を通過するときにJavaScriptを使用して色ラベルを表示する方...

MySQL 最適化接続最適化

記事「MySQL の最適化: キャッシュの最適化」では、システムによってコンパイルされた変数値、また...

主要ブラウザとそのカーネルの紹介

トライデント コア: IE、MaxThon、TT、The World、360、Sogou Brows...

FileZilla を使用して FTP サーバーに接続するプロセスの図

最初にサーバー上に FTP サーバーをセットアップし始めたとき、接続できないことがわかったので、Fi...

Vueはソースコード付きのリファレンスライブラリのメソッドを使用します

monaco-editor-vueの公式ソースコードは次のとおりです。インデックス 'mon...

Apache Bench で Web ストレス テストを実装する方法

1. Apache Benchの紹介ApacheBench は、Apache サーバーに付属する W...

テーブルの幅を固定して、テキストによって幅が変わらないように設定

ページ内のテーブルの幅を width="600px" に設定した後も、幅が固定さ...

Nginxホットデプロイメントの実装

目次セマフォNginx ホットデプロイメント上記のブログ投稿に従ってください。ファイアウォールをオフ...

Linux での MySQL 5.6.33 のインストールと設定のチュートリアル

このチュートリアルでは、LinuxでのMySQL 5.6.33のインストールと設定方法を参考までに紹...