2012-03-13 98 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)的行已经具有最大值并且不需要改变。

相关问题