2010-11-11 57 views
30

Tôi đang cố gắng xóa bản ghi từ một cơ sở dữ liệu dựa trên tiêu chí lựa chọn của một cơ sở dữ liệu khác. Chúng tôi có hai bảng, emailNotification lưu trữ một danh sách các công việc và email. Sau đó chúng ta có việc làm. Tôi muốn xóa emailThông báo cho các công việc đã bị đóng. Tôi đã tìm thấy một số ví dụ trước đó về Stackoverflow dẫn tôi đến loại cú pháp này (trước đây tôi đã cố gắng thực hiện phép nối trước vị trí).Xóa khỏi một bảng với tham gia

DELETE FROM emailNotification 
WHERE notificationId IN (
SELECT notificationId FROM emailNotification e 
LEFT JOIN jobs j ON j.jobId = e.jobId 
WHERE j.active = 1 
) 

Tôi gặp lỗi, bạn không thể chỉ định bảng 'emailNotication' của mục tiêu để cập nhật trong Điều khoản FROM.

+0

Từ http://dev.mysql.com/doc/refman/5.0/en/delete.html: Hiện tại, bạn không thể xóa khỏi bảng và chọn từ cùng một bảng trong truy vấn con, hãy xem câu trả lời của tôi bên dưới –

Trả lời

73

Tôi không chắc chắn về yêu cầu của bạn. Điều tôi hiểu từ câu hỏi của bạn là bạn muốn xóa tất cả các email công việc đã đóng. thử cái này;

DELETE e FROM emailNotification e 
LEFT JOIN jobs j ON j.jobId = e.jobId 
WHERE j.active = 1 AND CURDATE() < j.closeDate 
+1

Đó là khá nhiều nó có, bảng emailnotification lưu trữ một người sử dụng và một công việc, nó đảm bảo người dùng không được gửi email nhiều hơn một lần cho một công việc nhất định (nghĩ rằng công việc cảnh báo trên một trang web tuyển dụng). Tôi sẽ thử cái này ngay bây giờ. –

+8

Đây là một câu trả lời tuyệt vời. Điều gì là tinh tế ở đây là bạn phải bao gồm bí danh bảng sau từ khóa DELETE. Tôi đã không bao giờ làm điều đó trước đây, nhưng tôi đoán nó là cần thiết khi bạn có một JOIN trong một tuyên bố xóa. – Nate

+2

Bạn cũng có thể xóa các hàng phù hợp khỏi bảng công việc "j" khi bạn viết một cái gì đó như 'DELETE e, j FROM ...' Xem [ở đây] (http://www.mysqltutorial.org/mysql-delete- tham gia /) – beipawel

3

Bạn có thể thử một cái gì đó như sau:

DELETE FROM emailNotification 
WHERE jobId IN (
SELECT jobId FROM jobs j 
WHERE j.active = 1 
) 
+0

Cảm ơn lời giải thích đó Patrick –

5

MySQL DELETE hồ sơ với THAM GIA

Xóa nhiều bản ghi từ nhiều bảng sử dụng đơn Query như sau:

Bạn thường sử dụng INNER JOIN trong câu lệnh SELECT để chọn các bản ghi từ một bảng có các bản ghi tương ứng trong các bảng khác. Chúng ta cũng có thể sử dụng mệnh đề INNER JOIN với câu lệnh DELETE để xóa các bản ghi từ một bảng và các bản ghi tương ứng trong các bảng khác, để xóa các bản ghi từ cả bảng T1 và T2 đáp ứng một điều kiện cụ thể, bạn sử dụng câu lệnh sau:

DELETE T1, T2 
FROM T1 
INNER JOIN T2 ON T1.key = T2.key 
WHERE condition 

Lưu ý rằng bạn đặt tên bảng T1 và T2 giữa DELETE và FROM. Nếu bạn bỏ qua bảng T1, câu lệnh DELETE chỉ xóa các bản ghi trong bảng T2 và nếu bạn bỏ qua bảng T2, chỉ các bản ghi trong bảng T1 sẽ bị xóa.

Điều kiện tham gia T1.key = T2 .key chỉ định các bản ghi tương ứng trong bảng T2 cần được xóa.

Điều kiện trong mệnh đề WHERE chỉ định bản ghi nào trong T1 và T2 cần xóa.

+2

Ai đã ăn cắp ai? http://www.mysqltutorial.org/mysql-delete-join/ – random

Các vấn đề liên quan