如何更新MySQL表中的值如果其他值是重复的?
问题描述:
我有表结构如下:如何更新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
在此先感谢!
答
您可以选择从COL3在子查询中的最高值,做一个更新查询您的表值从子查询
UPDATE TBL1 SET COL3 = (SELECT COL3 FROM TBL1 WHERE COL1 = 'A' ORDER BY COL3 DESC LIMIT 0,1) AS a WHERE COL1 = 'A'
答
随着更新所需的数据连接。 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)
答
首先,让我们来加载样本数据
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)的行已经具有最大值并且不需要改变。
此代码正确工作A.如果我插入B whith值10的另一个记录,代码不起作用。我想更新所有匹配的记录。 – dido 2012-03-13 15:21:39
注意,B在样本集中只有一个值。由于这个原因在样本数据中没有更新。 – danihp 2012-03-13 16:04:37