2012-03-13 10 views
3

私は、次のような構造を持つテーブルがある:MySQLテーブルの値を更新するにはどうすればいいですか?

TBL1

COL1 COL2 COL2 
---- ---- ---- 
A B 1 
B C 3 
A C 11 
A D 13 
B D 10 

COL1の値が重複している場合はどのように私はCOL3を更新することができますか?

col3の値を最大の値で更新します。

Тheに見えるようにテーブルを結果:

COL1 COL2 COL2 
---- ---- ---- 
A B 13 
B C 10 
A C 13 
A D 13 
B D 10 

事前に感謝を!

答えて

1

あなたは、サブクエリでCOL3から最高値を選択して、更新が必要なデータと結合して、サブクエリ

UPDATE TBL1 SET COL3 = (SELECT COL3 FROM TBL1 WHERE COL1 = 'A' ORDER BY COL3 DESC LIMIT 0,1) AS a WHERE COL1 = 'A' 
1

から値を使用して、テーブルの上に更新クエリを行うことができます。 Correlated subqueries are not wellcome

テスト済み
update T inner 
join (select c1, max(c3) as m from T) T2 
on T.c1 = T2.c1 
set T.c3 = T2.m; 

mysql> create table T (c1 char(1), c3 int) ; 
Query OK, 0 rows affected (0.15 sec) 

mysql> insert into T values ('A', 1),('B',3),('A',11),('A',13); 
Query OK, 4 rows affected (0.02 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> select * From T; 
+------+------+ 
| c1 | c3 | 
+------+------+ 
| A | 1 | 
| B | 3 | 
| A | 11 | 
| A | 13 | 
+------+------+ 


mysql> update T inner join (select c1, max(c3) as m from T) T2 
on T.c1 = T2.c1 set T.c3 = T2.m; 
Query OK, 2 rows affected (0.07 sec) 
Rows matched: 3 Changed: 2 Warnings: 0 

mysql> select * from T; 
+------+------+ 
| c1 | c3 | 
+------+------+ 
| A | 13 | 
| B | 3 | 
| A | 13 | 
| A | 13 | 
+------+------+ 
4 rows in set (0.00 sec) 
+1

このコードは正しく動作します。B whith値10の別のレコードを挿入すると、コードが機能しません。私はすべての一致したレコードを更新したいと思います。 – dido

+0

サンプルセットにはBの値が1つしかないことに注意してください。このため、サンプルデータでは更新されません。 – danihp

1

まず、あなたは最高の価値をしたいような質問で、ご希望の出力を見ると、それが見えます

mysql> drop database if exists dilyan_kn; 
Query OK, 1 row affected (0.04 sec) 

mysql> create database dilyan_kn; 
Query OK, 1 row affected (0.00 sec) 

mysql> use dilyan_kn 
Database changed 
mysql> create table TBL1 
    -> (col1 char(1),col2 char(1),col3 int); 
Query OK, 0 rows affected (0.11 sec) 

mysql> insert into TBL1 values 
    -> ('A' , 'B' , 1), 
    -> ('B' , 'C' , 3), 
    -> ('A' , 'C' , 11), 
    -> ('A' , 'D' , 13), 
    -> ('B' , 'D' , 10); 
Query OK, 5 rows affected (0.06 sec) 
Records: 5 Duplicates: 0 Warnings: 0 

mysql> select * from TBL1; 
+------+------+------+ 
| col1 | col2 | col3 | 
+------+------+------+ 
| A | B | 1 | 
| B | C | 3 | 
| A | C | 11 | 
| A | D | 13 | 
| B | D | 10 | 
+------+------+------+ 
5 rows in set (0.00 sec) 

mysql> 

のは、あなたのサンプル・データをロードしてみましょう任意のcol1のcol3。

COL1 = Aの場合、あなたは異なる値1、11を有し、13 13は、COL1 = Bの最高

であり、あなたが異なる値を持つ3と10 10が最高であります

与えられたcol1に対してcol3の最高値を検出するサブクエリが必要です。ここで

そのクエリです:

mysql> SELECT col1,MAX(col3) maxcol3 
    -> FROM TBL1 GROUP BY col1; 
+------+---------+ 
| col1 | maxcol3 | 
+------+---------+ 
| A |  13 | 
| B |  10 | 
+------+---------+ 
2 rows in set (0.00 sec) 

mysql> 

を副問合せ

SELECT col1,MAX(col3) maxcol3 
FROM TBL1 GROUP BY col1; 

レッツ・ランさんは、テーブル全体に対してJOINとcol3という列にサブクエリの試合のたびCOL1列を更新するには、この副問合せを使用してみましょう表のcol1列。ここではそのクエリは次のとおりです。

UPDATE 
(
    SELECT col1,MAX(col3) maxcol3 
    FROM TBL1 GROUP BY col1 
) A 
INNER JOIN TBL1 B USING (col1) 
SET B.col3 = A.maxcol3; 

のは、クエリのJOINそのUPDATEを実行し、熟達しTBL1

のすべて
mysql> UPDATE 
    -> (
    ->  SELECT col1,MAX(col3) maxcol3 
    ->  FROM TBL1 GROUP BY col1 
    ->) A 
    -> INNER JOIN TBL1 B USING (col1) 
    -> SET B.col3 = A.maxcol3; 
Query OK, 3 rows affected (0.05 sec) 
Rows matched: 5 Changed: 3 Warnings: 0 

mysql> select * from TBL1; 
+------+------+------+ 
| col1 | col2 | col3 | 
+------+------+------+ 
| A | B | 13 | 
| B | C | 10 | 
| A | C | 13 | 
| A | D | 13 | 
| B | D | 10 | 
+------+------+------+ 
5 rows in set (0.00 sec) 

mysql> 

ミッションを選択してみましょう!

(col1、col3)が( 'A'、13)および( 'B'、10)である行が既に最大値を持つという事実から、変更する必要はありません。