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 マスタースレーブレプリケーションの原理と実践の詳細な説明

目次導入効果原理形状練習するこの記事では、例を使用して、MySQL マスター/スレーブ レプリケーシ...

この記事では、イベント委任を使用してJavaScriptメッセージボード機能を実装する方法について説明します。

イベント委任を使用してメッセージ ボード機能を実装します。 <!DOCTYPE html>...

MySQLトランザクションの基本的な学習と経験の共有

トランザクションは、論理的な操作のグループです。この操作グループを構成する各ユニットは、成功するか失...

Linux で独自の Nexus プライベート サーバーを構築する方法

この記事では、Linuxサーバー上でDockerを使用してNexusプライベートサーバーを構築する方...

入力ボックスの値を取得する方法のReactの例

入力ボックスの値を取得する複数の方法最初の方法は、制御されていないコンポーネントの取得です2番目の方...

Nginx リバース プロキシはポート 80 のリクエストを 8080 に転送します

まず、一連の概念を理解しましょう。nginx リバース プロキシとは何でしょうか?リバース プロキシ...

JavaScript で H5 ゴールド コイン関数を実装する (サンプル コード)

今日は春節の金貨の赤い封筒のアクティビティを作りました。なかなか良い出来だと思います。皆さんと共有し...

Vue で配列をクリアするいくつかの方法 (要約)

目次1. はじめに2. データを消去するいくつかの方法2.1 ref() の使用2.2 スライスの使...

Vueはミックスインを使用してコンポーネントを最適化します

目次ミックスインの実装フック関数のマージプロジェクト実践伸ばす要約するVue は mixins AP...

入力スクリプトなしでタイプ拡張を使用する方法

序文JS の型付けが弱く、記述基準が緩く、開発ツールのサポートが弱いため、前任者のコードをメンテナン...

CSS の div の下の同じ行にある複数の要素を右揃えにする

方法1:フロート:右さらに、フローティングにするとレイアウトがよりコンパクトになります(隙間がなくな...

ブラウザ内でHTMLタグを中央に配置するCSSスタイル

CSS スタイル:コードをコピーコードは次のとおりです。 <スタイル タイプ="te...

HTML 固定タイトル列、タイトル ヘッダー テーブル固有の実装コード

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

MySQLのFreeListメカニズムの詳細な説明

1. はじめにMySQL が起動すると、BufferPool が初期化されます。クエリ操作を実行する...