mysqlは別のテーブルの値で列を更新します


221

テーブルが2つあり、どちらも次のように見えます

id  name  value
===================
1   Joe     22
2   Derk    30

私は、の値をコピーする必要があるvalueからtableAtableB各テーブルでチェック名に基づきます。

このUPDATEステートメントのヒントはありますか?

回答:


413

この回答に加えて、tableA.valueに応じてtableB.valueを動的に変更する必要がある場合は、次のようにできます。

UPDATE tableB
INNER JOIN tableA ON tableB.name = tableA.name
SET tableB.value = IF(tableA.value > 0, tableA.value, tableB.value)
WHERE tableA.name = 'Joe'

うん、INNER JOINこの状況では完璧です。私はまた、CONCAT_WSpruduct名と別のテーブルのSKUをマージするために使用していました
vladkras 14

2
エイリアスを使用してこれを行う方法はありますか?
Gellie Ann、2016

「影響を受けた行」の数から5690が得られるため、これを試しても成功しませんでしたが、行の合計は59643です。なぜですか?これは、クエリです:UPDATE participants_registrations INNER JOIN participants ON participants.id = participants_registrations.participantId INNER JOIN registrations ON registrations.id = participants_registrations.registrationId LEFT JOIN groups ON (groups.id = registrations.groupId) SET registrations.groupId = groups.id, registrations.groupName = groups.name, participants.memberOfGroupName = groups.name
大スフィンクス

これは機能しません。tableBには、変更のない独自のデータがまだあります。wtools.io/paste-code/bzWA OPとこの回答に基づくサンプル。
sniffingdoggo

157

2つのテーブルを結合する必要があります。

たとえばname、tableAからの値をtableB同じ場所にコピーしたい場合ID

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 
WHERE t2.name = 'Joe'

アップデート1

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 

アップデート2

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.name = t2.name
SET t1.value = t2.value

1
さまざまな名前と値を持つ1kレコードを超えるレコード、ここでは1番目のレコードについての言い方
LeoSam

あなただけ削除することができwhere句を修正するかwhere...あなたのニーズに応じて、句を
ジョン・ウー

また、テーブルBはテーブルAよりも多くのレコードを取得しました。名前が存在するかどうかをテーブルBからaにチェックして、「値」の値をテーブルBにコピーします。
LeoSam 2012

私はあなたの質問を明確に理解したかどうかわかりません。更新された回答を確認できますか?
John Woo

私は両方の更新を試しましたが、2番目は734行で有効と表示されています。値を確認しましたが、すべて0のままです
LeoSam

91

第二の可能性は、

UPDATE TableB 
SET TableB.value = (
    SELECT TableA.value 
    FROM TableA
    WHERE TableA.name = TableB.name
);

7
はい、複雑な結合は必要ありません。必要なのは、フィールドを別のテーブルの値で更新することだけです。
davidkonrad 2015

8
はい、これは問題なく動作しますが、大きなデータセットでは非常に遅くなります。小さなテーブルで作業している場合は、この方法で問題ありませんが、上記のJOINをお勧めします。
frijj2k

また、このシナリオでは、SQL制約のため、テーブルAとBを同じテーブルにすることはできません。
Muhwu

@ frijj2kが.name両方のテーブルでインデックス付けされている場合、これはまだ遅いでしょうか?
Steverino 2017年

3

2番目のオプションは、セーフアップデートモードを使用している場合(および、KEY列を使用するWHEREなしでテーブルを更新しようとしたことを示すエラーが発生した場合)も実行できます。

UPDATE TableB  
SET TableB.value = (  
SELECT TableA.value  
    FROM TableA  
    WHERE TableA.name = TableB.name  
)  
**where TableB.id < X**  
;


1

一時テーブルにデータを保存する

Select * into tempTable from table1

列を更新します

 UPDATE table1
    SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);

0

私の場合、受け入れられた解決策は遅すぎました。180K行のテーブルの場合、更新率は1秒あたり約10行でした。これは、結合要素のインデックスを使用します。

最後に、手順を使用して問題を解決しました:

CREATE DEFINER=`my_procedure`@`%` PROCEDURE `rescue`()
BEGIN
    declare str VARCHAR(255) default '';
    DECLARE n INT DEFAULT 0;
    DECLARE i INT DEFAULT 0;
    DECLARE cur_name VARCHAR(45) DEFAULT '';
    DECLARE cur_value VARCHAR(10000) DEFAULT '';
    SELECT COUNT(*) FROM tableA INTO n;
    SET i=0;
    WHILE i<n DO 
      SELECT namea,valuea FROM tableA limit i,1 INTO cur_name,cur_value;
      UPDATE tableB SET nameb=cur_name where valueb=cur_value;
      SET i = i + 1;
    END WHILE;

END

それが私を助けてくれたように、将来誰かを助けることを願っています


-4

両方のテーブルに共通のフィールドがある場合、それはとても簡単です!....

Table-1 =更新するテーブル。表2 =データを取得するテーブル。

  1. 表1でクエリを作成し、共通のフィールド値を見つけます。
  2. ループを作成し、表1の値に従って、表2からすべてのデータを検索します。
  3. 再度、テーブル1で更新クエリを作成します。

$qry_asseet_list = mysql_query("SELECT 'primary key field' FROM `table-1`");

$resultArray = array();
while ($row = mysql_fetch_array($qry_asseet_list)) {
$resultArray[] = $row;
}



foreach($resultArray as $rec) {

    $a = $rec['primary key field'];

    $cuttable_qry = mysql_query("SELECT * FROM `Table-2` WHERE `key field name` = $a");

    $cuttable = mysql_fetch_assoc($cuttable_qry);



    echo $x= $cuttable['Table-2 field']; echo " ! ";
    echo $y= $cuttable['Table-2 field'];echo " ! ";
    echo $z= $cuttable['Table-2 field'];echo " ! ";


    $k = mysql_query("UPDATE `Table-1` SET `summary_style` = '$x', `summary_color` = '$y', `summary_customer` = '$z' WHERE `summary_laysheet_number` = $a;");

    if ($k) {
        echo "done";
    } else {
        echo mysql_error();
    }


}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.