Tôi có một bảng trong MYSQL:cách mysql cập nhật tự bàn làm việc
CREATE TABLE test.tem(a INT,b INT);
Với dưới đây dữ liệu:
INSERT INTO test.tem VALUES(1,2),(1,1),(1,NULL),(2,3);
Bây giờ dữ liệu nên là:
+------+------+
| a | b |
+------+------+
| 1 | 2 |
| 1 | 1 |
| 1 | NULL |
| 2 | 3 |
+------+------+
Tôi muốn cập nhật cột b vào nhóm min (b) theo cột a.
Vì vậy, SQL nên là:
UPDATE test.tem o
SET o.b = (SELECT
MIN(b)
FROM test.tem i
WHERE i.a = o.a)
Nhưng MYSQL Không thể chỉ định bảng mục tiêu cho bản cập nhật trong mệnh đề FROM
Vì vậy, tôi nghĩ rằng bên dưới SQL có thể giải quyết câu hỏi của tôi với hiệu suất tốt:
UPDATE test.tem t1
JOIN test.tem t2
ON t1.a = t2.a
SET t1.b = t2.b
WHERE t1.b IS NULL
OR t1.b > t2.b;
Nhưng kết quả là:
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
+------+------+
Trên thực tế kết quả tôi cần là:
+------+------+
| a | b |
+------+------+
| 1 | 1 |
| 1 | 1 |
| 1 | 1 |
| 2 | 3 |
+------+------+
Câu hỏi 1: Tại sao MYSQL làm việc ra các kết quả không chính xác với SQL? SQL đúng với hiệu quả tốt nên là gì?
Câu hỏi 2: SQL nên là gì nếu tôi chỉ muốn cập nhật b với giá trị NULL (chỉ cập nhật bản ghi thứ ba)?
thiệu về câu hỏi 2, tôi đã cố gắng sử dụng SQL không chính xác dưới đây:
UPDATE test.tem t1
JOIN test.tem t2
ON t1.a = t2.a
AND t1.b IS NULL
SET t1.b = t2.b
WHERE t1.b IS NULL
OR t1.b > t2.b;
Phải mất khoảng 5 phút để cập nhật trong một bảng với 4,5 triệu bản sử dụng SQL của bạn. Bạn có thể giúp tôi tìm ra lỗi của SQL của tôi không? – bluearrow
@bluearrow Vì đây là một chủ đề khác, bạn nên hỏi một câu hỏi khác, cung cấp cấu trúc bảng (bao gồm chỉ mục của bạn), yêu cầu và [kế hoạch truy vấn] của nó (http://dev.mysql.com/doc/refman /4.1/en/execution-plan-information.html). –
Rất mong nhận được câu trả lời của bạn: http://stackoverflow.com/questions/18117717/mysql-join-update-internal-steps – bluearrow