MySQL でデータをクエリし、条件に基づいて別のテーブルに更新する方法の例

MySQL でデータをクエリし、条件に基づいて別のテーブルに更新する方法の例

この記事では、MySQL が条件に基づいてデータをクエリし、別のテーブルに更新する方法を例を使用して説明します。ご参考までに、詳細は以下の通りです。

元のデータベースには3つのテーブルがあります

  • travel_way: 旅行ルートテーブル。ルートの詳細情報を保存します。
  • traveltag: ルートの目的地やその他の情報を保存するルートタグテーブル
  • tagrelation: ルートと目的地の対応関係を保存するタグ対応表

ビジネス ロジックの変更により、これらを 1 つのテーブルにマージし、traveltag の目的地情報を travel_way に挿入する必要があります。

まず、すべてのルートに対応する目的地を取得し、ルート ID ごとにグループ化し、目的地を 1 行に結合して、カンマで区切ります。

次のようにコードをコピーします
SELECT travel_way.id,GROUP_CONCAT(traveltag.content) FROM travel_way LEFT JOIN tagrelation on travel_way.id = tagrelation.travel_id LEFT JOIN traveltag ON tagrelation.tag_id = traveltag.id GROUP BY travel_way.id

まず、見つかったデータを新しく作成したテーブルに保存します。

次のようにコードをコピーします
mid (travelway_id,destination) に INSERT します。SELECT travel_way.id,GROUP_CONCAT(traveltag.content) FROM travel_way LEFT JOIN tagrelation on travel_way.id = tagrelation.travel_id LEFT JOIN traveltag ON tagrelation.tag_id = traveltag.id GROUP BY travel_way.id

次に、mid テーブルのデータを travel_way に更新します。更新であるため、 insert into select from ステートメントは使用できません。

次のようにコードをコピーします
travel_way,mid を更新し、travel_way.destination = mid.destination を設定します。travel_way.id = mid.travelway_id です。

目的地をカンマ区切りの文字列としてtravel_wayテーブルに正常にインポートしました

使用されるメソッド、group_concatについてお話しましょう

group_concat( [DISTINCT] 接続するフィールド [Order BY sort field ASC/DESC] [Separator 'separator'] )、この関数は同じ行を結合することができます

商品から*を選択します。
+------+------+
|id| 価格|
+------+------+
|1 | 10|
|1 | 20|
|1 | 20|
|2 | 20|
|3 | 200 |
|3 | 500 |
+------+------+
セット内の 6 行 (0.00 秒)

IDでグループ化し、価格フィールドの値をコンマで区切って同じ行に出力します(デフォルト)

id でグループ化された商品から id、group_concat(price) を選択します。
+------+--------------------+
| id| group_concat(価格) |
+------+--------------------+
|1 | 10,20,20|
|2 | 20 |
|3 | 200,500|
+------+--------------------+
セット内の 3 行 (0.00 秒)

ID でグループ化し、価格フィールドを重複なく 1 行にカンマで区切って出力します。

ID 別に商品グループから id、group_concat(distinct price) を選択します。
+------+------------------------------------------+
| id| group_concat(個別の価格) |
+------+------------------------------------------+
|1 | 10,20|
|2 | 20 |
|3 | 200,500 |
+------+------------------------------------------+
セット内の 3 行 (0.00 秒)

ID でグループ化し、価格フィールドの値を 1 行に出力します。カンマで区切られ、価格の降順で並べ替えられます。

商品グループから id、group_concat(price order by price desc) を id で選択します。
+------+---------------------------------------+
| id| group_concat(価格を価格降順で並べ替え) |
+------+---------------------------------------+
|1 | 20,20,10 |
|2 | 20|
|3 | 500,200|
+------+---------------------------------------+
セット内の 3 行 (0.00 秒)

insert into select from はinsert into select from挿入します。

db1_name(field1,field2) に挿入し、db2_name から field1,field2 を選択します。

ターゲット db2 が存在している必要があります。テストしてみましょう。次の構造を持つ 2 つのテーブルがあります。

insert_one から * を選択します。
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 1 | ティエン・シャオシ | 25 | |
| 2 | 劉ダニウ | 26 | |
| 3 | 鄭大奎 | 28 | |
| 4 | 胡二狗 | 30 | |
+----+--------+-----+-----+
4行セット

 
insert_sex から * を選択します。
+----+-----+
| ID | 性別 |
+----+-----+
| 1 | 1 |
| 2 | 2 |
| 3 | 1 |
| 4 | 2 |
+----+-----+
4行セット

表2から性別データを探し、表1に挿入します。

insert_one(sex) に insert_sex から sex を選択します。
クエリは正常、4 行が影響を受けました
insert_one から * を選択します。
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 1 | ティエン・シャオシ | 25 | |
| 2 | 劉ダニウ | 26 | |
| 3 | 鄭大奎 | 28 | |
| 4 | 胡二狗 | 30 | |
| 5 | | | 1 |
| 6 | | | 2 |
| 7 | | | 1 |
| 8 | | | 2 |
+----+--------+-----+-----+
8行セット

結果は恥ずかしいものです。新しいデータを挿入するのではなく、このテーブルの性別フィールドを更新したいのです。このコマンドは、空のテーブルにデータをインポートする場合にのみ適用できます。そのため、上記の実際のニーズでは、新しいテーブル mid を作成し、update を使用してデータを転送および更新しました。

次のようにコードをコピーします
tb1、tb2を更新し、tb1.address=tb2.address、where tb1.name=tb2.nameを設定します。

一致条件に従って、表 1 のデータを表 2 のデータに置き換え (更新) します。表 1 と表 2 は関連している必要があります。

insert_one、insert_sex を更新し、insert_one.sex = insert_sex.sex とし、insert_one.id = insert_sex.id とします。
クエリは正常、4 行が影響を受けました
insert_one から * を選択します。
+----+--------+-----+-----+
| ID | 名前 | 年齢 | 性別 |
+----+--------+-----+-----+
| 1 | ティエン・シャオシ | 25 | 1 |
| 2 | 劉ダニウ | 26 | 2 |
| 3 | 鄭大奎 | 28 | 1 |
| 4 | 胡二狗 | 30 | 2 |
| 5 | | | 1 |
| 6 | | | 2 |
| 7 | | | 1 |
| 8 | | | 2 |
+----+--------+-----+-----+
8行セット

データは insert_one テーブルの sex フィールドに正常に更新されました。

MySQL 関連のコンテンツに興味のある読者は、次のトピックを確認してください: 「MySQL 共通関数の概要」、「MySQL ログ操作スキルの概要」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキルの概要」、および「MySQL データベース ロック関連スキルの概要」。

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • Python SQL ステートメントを使用して、MySQL データベースで複数条件のあいまいクエリを実行するアイデアの詳細な説明
  • MySQL データベースの必須条件クエリ ステートメント
  • MySQLはクエリ条件としてJSONフィールドの内容に基づいてデータを取得します(JSON配列を含む)
  • MySQL と PHP の基礎と応用: データクエリステートメント
  • Mysql データベース テーブルのインデックスによってクエリ速度が向上しないのはなぜですか?
  • MySQL データの挿入とデータのクエリ
  • データのクエリを実行するための MySQL 学習の前提条件

<<:  Tomcat セキュリティ仕様 (Tomcat セキュリティ強化と仕様)

>>:  プロジェクトを素早く構築するためのvite+vue3.0+ts+element-plusの実装

推薦する

意外と知らないLinuxのSSHコマンドの使い方7選を徹底解説

システム管理者は複数のサーバーを同時に管理する場合があり、これらのサーバーは異なる場所に配置されてい...

Centos8 の Django プロジェクトに nginx+uwsgi をデプロイするチュートリアル

1. 仮想環境virtualenvのインストール1. virtualenvをインストールするpip3...

DockerはRedis5.0をビルドし、データをマウントします

目次1. 永続データの簡単なマウント2. DockerFileでイメージをビルドし、設定ファイルを指...

jQueryの競合問題を解決する方法

フロントエンド開発において、$ は jQuery の関数です。$ のパラメータが異なると、実装される...

CSS フォーム検証機能の実装コード

レンダリング原理フォーム要素には、正規表現(携帯電話番号、メールアドレス、IDカードなど)をカスタマ...

HTML要素にフォーカスを設定する方法

コードをコピーコードは次のとおりです。 <本文<フォームアクション="&quo...

Linux システム Docker への ASP.NET Core アプリケーションのデプロイのプロセス分析

目次1. システム環境2. 運用プロセスと途中で遭遇した問題1. システム環境1. Tencent ...

CentOS 8 / RHEL 8 に VirtualBox 6.0 をインストールするための詳細なチュートリアル

VirtualBox は、技術者が異なる種類の複数の仮想マシン (VM) を同時に実行できるようにす...

Keras を使って SQL インジェクション攻撃を判断する (例の説明)

この記事では、ディープラーニングフレームワーク keras を使用して、SQL インジェクションの特...

MySQL インデックス プッシュダウンを 5 分で学ぶ

目次序文インデックス プッシュダウンとは何ですか?インデックスプッシュダウン最適化の原理インデックス...

JavaScript で右クリック メニューを統合する layim のサンプル コード

目次1. 効果の実証2. 実装チュートリアル3. 最後に、完全なコードを添付します4. その他の右ク...

Vue 条件付きレンダリング v-if と v-show

目次1. 動詞-if 2. <template> で v-if を使用する3. キーを使...

HTMLヘッダータグの使用に関する詳細な説明

HTMLはヘッドとボディの2つの部分で構成されています** ヘッド内のタグはヘッドタグです** タイ...

MySql バッチに挿入するときにデータの重複を避ける方法

目次序文1. ignore を挿入2. 重複キーの更新時3. を置き換える要約する序文Mysql は...

JavaScript Alert関数の実行順序の詳細な説明

目次質問分析する解決するAlert() 関数を置き換えるsetTimeOut関数まとめ質問数日前、J...