首先,讓我們來加載樣本數據
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