2010-05-04 47 views
143

Tôi có hai bảng, một cho thời hạn công việc, một cho mô tả một công việc. Mỗi công việc có thể có một trạng thái và một số trạng thái có nghĩa là thời hạn của công việc phải được xóa khỏi bảng khác.Xóa các hàng bằng MySQL LEFT JOIN

tôi có thể dễ dàng SELECT các công việc/thời hạn đáp ứng tiêu chí của tôi với một LEFT JOIN:

SELECT * FROM `deadline` 
LEFT JOIN `job` ON deadline.job_id = job.job_id 
WHERE `status` = 'szamlazva' 
OR `status` = 'szamlazhato' 
OR `status` = 'fizetve' 
OR `status` = 'szallitva' 
OR `status` = 'storno' 

(status thuộc về job bảng không deadline)

Nhưng khi tôi muốn xóa các hàng từ deadline, MySQL sẽ phát ra lỗi. truy vấn của tôi là:

DELETE FROM `deadline` 
LEFT JOIN `job` 
ON deadline.job_id = job.job_id 
WHERE `status` = 'szamlazva' 
OR `status` = 'szamlazhato' 
OR `status` = 'fizetve' 
OR `status` = 'szallitva' 
OR `status` = 'storno' 

lỗi MySQL nói gì:

Bạn có một lỗi trong cú pháp SQL của bạn; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn cho đúng cú pháp để sử dụng gần 'LEFT JOIN job ON deadline.job_id = job.job_id ĐÂU status = 'szaml' tại dòng 1

Làm thế nào tôi có thể biến SELECT của tôi vào một truy vấn DELETE đang hoạt động?

Trả lời

260

Bạn chỉ cần chỉ định bảng nào để áp dụng DELETE.

Xóa chỉ deadline hàng:

DELETE `deadline` FROM `deadline` LEFT JOIN `job` .... 

Xóa deadlinejob hàng:

DELETE `deadline`, `job` FROM `deadline` LEFT JOIN `job` .... 

Xóa chỉ job hàng:

DELETE `job` FROM `deadline` LEFT JOIN `job` .... 
+5

Cũng sử dụng "trạng thái trong ('szamlazva', 'szamlazhato', 'fizetve', .........)" – Salil

+3

Với "AS" tôi phải sử dụng bí danh trong mệnh đề của mình để làm cho nó hoạt động cho mục đích (xóa trẻ em mồ côi): DELETE t1 TỪ bảng1 AS t1 TÌM THAM GIA t2 AS t2 TRÊN t1.uid = t2.result WHERE t2.result IS NULL – Urs

+0

Tham chiếu: http://dev.mysql.com/doc/ refman/5.7/en/delete.html – Slawa

1
DELETE FROM deadline where ID IN (
    SELECT d.ID FROM `deadline` d LEFT JOIN `job` ON deadline.job_id = job.job_id WHERE `status` = 'szamlazva' OR `status` = 'szamlazhato' OR `status` = 'fizetve' OR `status` = 'szallitva' OR `status` = 'storno'); 

Tôi không chắc liệu loại truy vấn phụ đó có hoạt động trong MySQL hay không, nhưng hãy thử. Tôi giả sử bạn có một cột ID trong bảng hạn chót của bạn.

+1

OP vẫn cần chỉ định những gì để 'DELETE' làm cho truy vấn rõ ràng. Sử dụng 'In' với truy vấn con làm cho mọi thứ chậm hơn rất nhiều. Tốt nhất nên tránh. –

+0

Không có bảng nào được đề cập giữa 'DELETE' và' FROM'. –

25

Nếu bạn đang sử dụng "bảng dưới dạng ", sau đó chỉ định nó để xóa.

Trong ví dụ, tôi xóa tất cả các hàng trong bảng_1 không tồn tại trong bảng_2.

DELETE t1 FROM `table_1` t1 LEFT JOIN `table_2` t2 ON t1.`id` = t2.`id` WHERE t2.`id` IS NULL 
+0

@Roman Losev - Điểm của WHERE 1 – vmanta

+0

Đó là phương pháp chọn mặc định của tôi ... Xin lỗi, vì điều đó. Quên để xóa. Đã chỉnh sửa bài đăng. –