mysqlクエリーデータを実装し、条件に従って別のテーブルに更新する方法の例

5210 ワード

この例では、mysqlがクエリーデータを実装し、条件に従って別のテーブルに更新する方法について説明します.皆さんの参考にしてください.具体的には以下の通りです.
元のデータベースには3枚のテーブルがあります
  • travel_way:観光路線表、路線の具体的な情報を保存する
  • traveltag:回線ラベルテーブル、回線宛先などの情報を格納
  • .
  • tagrelation:ラベル対応テーブル、格納回線と宛先の対応関係
  • ビジネスロジックの変更により、テーブルにマージし、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に保存しました
    
       INSERT into mid (travelway_id,destination) 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文は使えません
    
       update travel_way,mid set travel_way.destination = mid.destination where travel_way.id = mid.travelway_id 
     

    目的地をカンマで区切った文字列でtravel_をインポートできました.wayテーブル
    いくつかの方法を説明しますconcat
    group_concat([DISTINCT]接続するフィールド[Order BYソートフィールドASC/DESC][Separator'セパレータ'])は、同じ行を組み合わせることができます.
    
    select * from goods;
    +------+------+
    | id| price|
    +------+------+
    |1 | 10|
    |1 | 20|
    |1 | 20|
    |2 | 20|
    |3 | 200 |
    |3 | 500 |
    +------+------+
    6 rows in set (0.00 sec)
    
    

    idでグループ化し、priceフィールドの値を同じ行に印刷し、カンマで区切る(デフォルト)
    
    select id, group_concat(price) from goods group by id;
    +------+--------------------+
    | id| group_concat(price) |
    +------+--------------------+
    |1 | 10,20,20|
    |2 | 20 |
    |3 | 200,500|
    +------+--------------------+
    3 rows in set (0.00 sec)
    
    

    idでグループ化してpriceフィールドを1行に再印刷し、カンマで区切る
    
    select id,group_concat(distinct price) from goods group by id;
    +------+-----------------------------+
    | id| group_concat(distinct price) |
    +------+-----------------------------+
    |1 | 10,20|
    |2 | 20 |
    |3 | 200,500 |
    +------+-----------------------------+
    3 rows in set (0.00 sec)
    
    

    idでグループ化し、priceフィールドの値を1行に印刷し、カンマで区切り、priceの逆順に並べます.
    
    select id,group_concat(price order by price desc) from goods group by id;
    +------+---------------------------------------+
    | id| group_concat(price order by price desc) |
    +------+---------------------------------------+
    |1 | 20,20,10 |
    |2 | 20|
    |3 | 500,200|
    +------+---------------------------------------+
    3 rows in set (0.00 sec)
    
    
    insert into select fromクエリーされたレコードをテーブルに挿入します.
    
    INSERT INTO db1_name(field1,field2) SELECT field1,field2 FROM db2_name
    
    

    要求ターゲットdb 2は存在しなければならないが、以下にテストすると、2つのテーブルがあり、構造は以下の通りである.
    
    select * from insert_one;
    +----+--------+-----+-----+
    | id | name  | age | sex |
    +----+--------+-----+-----+
    | 1 |     | 25 |   |
    | 2 |     | 26 |   |
    | 3 |     | 28 |   |
    | 4 |     | 30 |   |
    +----+--------+-----+-----+
    4 rows in set
    
     
    select * from insert_sex;
    +----+-----+
    | id | sex |
    +----+-----+
    | 1 | 1  |
    | 2 | 2  |
    | 3 | 1  |
    | 4 | 2  |
    +----+-----+
    4 rows in set
    
    

    表2から性別データを検索し、表1に挿入する
    
    into insert_one(sex) select sex from insert_sex;
    Query OK, 4 rows affected
    select * from insert_one;
    +----+--------+-----+-----+
    | id | name  | age | sex |
    +----+--------+-----+-----+
    | 1 |     | 25 |   |
    | 2 |     | 26 |   |
    | 3 |     | 28 |   |
    | 4 |     | 30 |   |
    | 5 |    |   | 1  |
    | 6 |    |   | 2  |
    | 7 |    |   | 1  |
    | 8 |    |   | 2  |
    +----+--------+-----+-----+
    8 rows in set
    
    

    結果は気まずいです.私はこのテーブルのsexフィールドを更新したいのですが、新しいデータを挿入するのではなく、このコマンドは空のテーブルにデータをインポートするのに適しています.そのため、上記の実際のニーズでは、新しいテーブルmidを構築し、updateを利用してデータを転送して更新しました.
    
       UPDATE tb1,tb2 SET tb1.address=tb2.address WHERE tb1.name=tb2.name 
     

    条件マッチングにより、表1のデータを(更新)表2のデータに置き換え、表1と表2を関連付けなければならない
    
    update insert_one,insert_sex set insert_one.sex = insert_sex.sex where insert_one.id = insert_sex.id;
    Query OK, 4 rows affected
    select * from insert_one;
    +----+--------+-----+-----+
    | id | name  | age | sex |
    +----+--------+-----+-----+
    | 1 |     | 25 | 1  |
    | 2 |     | 26 | 2  |
    | 3 |     | 28 | 1  |
    | 4 |     | 30 | 2  |
    | 5 |    |   | 1  |
    | 6 |    |   | 2  |
    | 7 |    |   | 1  |
    | 8 |    |   | 2  |
    +----+--------+-----+-----+
    8 rows in set
    
    

    insert_へのデータ更新に成功しましたoneテーブルのsexフィールドにあります.
    MySQLに関する詳細については、「MySQL常用関数大要約」、「MySQLログ操作テクニック大全」、「MySQLトランザクション操作テクニック要約」、「SQL Myストレージプロセステクニック大全」および「MySQLデータベースロックに関するテクニック汇总」を参照してください.
    本明細書では、MySQLデータベース・メーターについて説明します.