[英]How to update table in mysql using subquery of same table
我有一個名為my_data的表,如下所示:
+-------+-------+--------+
| attr1 | attr2 | att3 |
+-------+-------+--------+
| 3 | 1 | 1 |
| 4 | 2 | 1 |
| 5 | 3 | 1 |
| 3 | 6 | 1 |
| 3 | 7 | 1 |
| 3 | 8 | 1 |
| 8 | 8 | 1 |
| 9 | 7 | 1 |
| 3 | 9 | 1 |
+-------+-------+--------+
我需要這樣做:
UPDATE my_data
SET
attr3 = 0
WHERE (attr1, attr2) IN (SELECT attr1, attr2 FROM my_data GROUP BY attr1);
在mysql中,更新將無法與select語句一起使用。 還有其他方法嗎?
您可以使用內部查詢來聯接my_data並更新attr3,如下所示:
UPDATE my_data a
JOIN (SELECT attr1, attr2 FROM my_data GROUP BY attr1) b
ON a.attr1 = b.attr1 AND a.attr2 = b.attr1
SET a.attr3 = 0;
盯着上面的數據,我想您想將具有多個attr2
值的任何attr1
attr3
更新為0。
如果是這樣,查詢應計算有多少attr2
:
UPDATE
(SELECT attr1,COUNT(attr2) attr2count FROM my_data
GROUP BY attr1 HAVING COUNT(attr2) > 1) A
INNER JOIN my_data B USING (attr1)
SET B.attr3 = 0;
我選擇SELECT ... GROUP BY ... HAVING
是因為SELECT attr1, attr2 FROM my_data GROUP BY attr1
更穩定,因為attr2
只是attr1
被復制的數字之一。
根據有關GROUP BY
的MySQL文檔, 不能保證mysql在使用GROUP BY
時選擇哪個值 。
我已經在DBA StackExchange中回答了一個有關此有爭議的依賴GROUP BY
順序的問題。
如果您確定要為attr1=3
確定具有最小attr2
的行將attr3設置為0,那么問題的答案將是:
UPDATE
(SELECT attr1,MIN(attr2) attr2 FROM my_data
GROUP BY attr1 HAVING COUNT(attr2) > 1) A
INNER JOIN my_data B USING (attr1,attr2)
SET B.attr3 = 0;
讓我們同時測試它們:
首先是示例數據:
drop database if exists clickit;
create database clickit;
use clickit
create table my_data (attr1 INT,attr2 INT,attr3 INT);
insert into my_data values
(3,1,1),(4,2,1),(5,3,1),
(3,6,1),(3,7,1),(3,8,1),
(8,8,1),(9,7,1),(3,9,1);
這是加載的示例數據:
mysql> drop database if exists clickit;
Query OK, 1 row affected (0.12 sec)
mysql> create database clickit;
Query OK, 1 row affected (0.00 sec)
mysql> use clickit
Database changed
mysql> create table my_data (attr1 INT,attr2 INT,attr3 INT);
Query OK, 0 rows affected (0.07 sec)
mysql> insert into my_data values
-> (3,1,1),(4,2,1),(5,3,1),
-> (3,6,1),(3,7,1),(3,8,1),
-> (8,8,1),(9,7,1),(3,9,1);
Query OK, 9 rows affected (0.05 sec)
Records: 9 Duplicates: 0 Warnings: 0
mysql> select * from my_data;
+-------+-------+-------+
| attr1 | attr2 | attr3 |
+-------+-------+-------+
| 3 | 1 | 1 |
| 4 | 2 | 1 |
| 5 | 3 | 1 |
| 3 | 6 | 1 |
| 3 | 7 | 1 |
| 3 | 8 | 1 |
| 8 | 8 | 1 |
| 9 | 7 | 1 |
| 3 | 9 | 1 |
+-------+-------+-------+
9 rows in set (0.00 sec)
mysql>
這是我建議的第一個查詢:
mysql> UPDATE
-> (SELECT attr1,COUNT(attr2) attr2count FROM my_data
-> GROUP BY attr1 HAVING COUNT(attr2) > 1) A
-> INNER JOIN my_data B USING (attr1)
-> SET B.attr3 = 0;
Query OK, 5 rows affected (0.10 sec)
Rows matched: 5 Changed: 5 Warnings: 0
mysql> select * from my_data;
+-------+-------+-------+
| attr1 | attr2 | attr3 |
+-------+-------+-------+
| 3 | 1 | 0 |
| 4 | 2 | 1 |
| 5 | 3 | 1 |
| 3 | 6 | 0 |
| 3 | 7 | 0 |
| 3 | 8 | 0 |
| 8 | 8 | 1 |
| 9 | 7 | 1 |
| 3 | 9 | 0 |
+-------+-------+-------+
9 rows in set (0.00 sec)
mysql>
對於具有多個行的attr1,第一個將attr3更改為0
讓我們重新加載示例並運行第二個查詢:
mysql> drop database if exists clickit;
Query OK, 1 row affected (0.04 sec)
mysql> create database clickit;
Query OK, 1 row affected (0.00 sec)
mysql> use clickit
Database changed
mysql> create table my_data (attr1 INT,attr2 INT,attr3 INT
Query OK, 0 rows affected (0.07 sec)
mysql> insert into my_data values
-> (3,1,1),(4,2,1),(5,3,1),
-> (3,6,1),(3,7,1),(3,8,1),
-> (8,8,1),(9,7,1),(3,9,1);
Query OK, 9 rows affected (0.05 sec)
Records: 9 Duplicates: 0 Warnings: 0
mysql> select * from my_data;
+-------+-------+-------+
| attr1 | attr2 | attr3 |
+-------+-------+-------+
| 3 | 1 | 1 |
| 4 | 2 | 1 |
| 5 | 3 | 1 |
| 3 | 6 | 1 |
| 3 | 7 | 1 |
| 3 | 8 | 1 |
| 8 | 8 | 1 |
| 9 | 7 | 1 |
| 3 | 9 | 1 |
+-------+-------+-------+
9 rows in set (0.00 sec)
mysql> UPDATE
-> (SELECT attr1,MIN(attr2) attr2 FROM my_data
-> GROUP BY attr1 HAVING COUNT(attr2) > 1) A
-> INNER JOIN my_data B USING (attr1,attr2)
-> SET B.attr3 = 0;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from my_data;
+-------+-------+-------+
| attr1 | attr2 | attr3 |
+-------+-------+-------+
| 3 | 1 | 0 |
| 4 | 2 | 1 |
| 5 | 3 | 1 |
| 3 | 6 | 1 |
| 3 | 7 | 1 |
| 3 | 8 | 1 |
| 8 | 8 | 1 |
| 9 | 7 | 1 |
| 3 | 9 | 1 |
+-------+-------+-------+
9 rows in set (0.00 sec)
mysql>
試試看 !!!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.