序文 指定した文字による結合または分割は一般的なシナリオです。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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Vue2.0/3.0 での provide と inject の使用例
>>: Linux サーバー上で複数の SVN リポジトリを構成するプロセスの詳細な説明
目次01 MySQLルーターの紹介MySQL Router とは何ですか? 02 MySQLルータの...
要件:PC側とモバイル側は2つの独立したプロジェクトです。2つのプロジェクトの内容は基本的に同じで、...
div を使用してマスクを作成したり、ポップアップ ウィンドウをシミュレートしたりします。ただし、I...
最近、Microsoft は Docker をネイティブにサポートする Windows Server...
1. docker に nginx をインストールします。 docker に Nginx をインスト...
1. parseFloat() 関数Web ページ上に簡単な計算機を作成し、テキスト ボックスに ...
この記事は主にMySQLの日付処理関数のサンプル分析を紹介します。この記事ではサンプルコードを詳細に...
関連記事: MySQL8.0.20 インストール チュートリアルとインストールの問題に関する詳細なチ...
取引トランザクションはビジネス ロジックの基本単位です。各トランザクションは一連の SQL ステート...
序文プロジェクト要件: Dockeridea に Docker プラグインをインストールし、Dock...
さっそく、コードを直接投稿します。具体的なコードは次のとおりです。 <!DOCTYPE htm...
この記事では、ボトムクエリ機能を実装するためのVueの具体的なコードを例として紹介します。具体的な内...
この記事では、MySQL で複数のテーブルを使用して 1 対多のクエリを使用して最新のデータを取得す...
提案: コードをできるだけ手書きすると、学習の効率と深さを効果的に向上できます。デフォルトでは、&l...
この記事の例では、フルスクリーンスクロールを実現するためのjQueryの具体的なコードを参考までに共...