2012-03-13 92 views
3

我有表結構如下:如何更新MySQL表中的值如果其他值是重複的?

TBL1

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

如何更新COL3如果COL1值是重複的?

我希望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

此代碼正確工作A.如果我插入B whith值10的另一個記錄,代碼不起作用。我想更新所有匹配的記錄。 – dido 2012-03-13 15:21:39

+0

注意,B在樣本集中只有一個值。由於這個原因在樣本數據中沒有更新。 – danihp 2012-03-13 16:04:37

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> 

綜觀問題所需輸出,它看起來像你想的最高值col3用於任何給定的col1。

對於COL1 = A,則有不同的值1,圖11,和13 13是最高

對於COL1 = B,則有不同的值3和10 10是最高

您將需要一個子查詢來查找任何給定col1的col3的最高值。

下面是查詢:

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

讓我們運行子查詢

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> 

讓我們用這個子查詢的加入對整個表並更新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; 

讓我們運行UPDATE JOIN查詢和選擇所有任務完成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> 

5行匹配但只有3行更改的原因源於(col1,col3)爲('A',13)和('B',10)的行已經具有最大值並且不需要改變。

相關問題