Xóa các hàng với MySQL LEFT THAM GIA


185

Tôi có hai bảng, một bảng cho thời hạn công việc, một bảng để 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.

Tôi có thể dễ dàng thực hiện SELECTcác công việc / thời hạn đáp ứng tiêu chí của mình bằng 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'

( statusthuộc về jobbảng không deadline)

Nhưng khi tôi muốn xóa các hàng này khỏi deadline, MySQL sẽ xuất hiện một 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 không 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 để biết đúng cú pháp để sử dụng gần 'LEFT THAM GIA jobTRÊN deadline.job_id = job.job_id WHERE status=' szaml 'ở dòng 1

Làm thế nào tôi có thể biến tôi SELECTthành một DELETEtruy vấn làm việc ?

Câu trả lời:


334

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

Chỉ xóa các deadlinehàng:

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

Xóa deadlinejobhàng:

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

Chỉ xóa các jobhàng:

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

4
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 của mình (xóa trẻ mồ côi): XÓA t1 TỪ bảng1 AS t1 LEFT THAM GIA t2 AS t2 ON
Urs

Thật thú vị, trình kiểm tra cú pháp PHPMyAdmin 4.5.1 của tôi sẽ không chấp nhận bất cứ điều gì giữa DELETEFROM, nhưng truy vấn vẫn chạy tốt khi tôi nhấn Go.
đất sét

38

Nếu bạn đang sử dụng "bảng là", 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

4
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 loại truy vấn phụ đó có hoạt động trong MySQL không, nhưng hãy thử nó. Tôi giả sử bạn có một cột ID trong bảng thời hạn.


1
OP vẫn cần chỉ định những gì DELETEcần làm cho truy vấn không rõ ràng. Sử dụng Invới các 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.
Ian Atkin

Không có bảng được đề cập giữa DELETEFROM.
Istiaque Ahmed

1

Thử cái này:

DELETE `deadline`
FROM `deadline`
INNER JOIN `job` ON `deadline`.`job_id` = `job`.`id`
WHERE `job`.`id` = 123

1

MySQL cho phép bạn sử dụng mệnh đề INNER THAM GIA trong câu lệnh XÓA để xóa các hàng khỏi một bảng và các hàng khớp trong một bảng khác.

Ví dụ: để xóa các hàng từ cả hai bảng T1 và T2 đáp ứng một điều kiện đã chỉ định, 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 các từ khóa XÓA và TỪ. Nếu bạn bỏ qua bảng T1, câu lệnh DELETE chỉ xóa các hàng trong bảng T2. Tương tự, nếu bạn bỏ qua bảng 2, câu lệnh DELETE sẽ chỉ xóa các hàng trong bảng T1.

Hy vọng điều này giúp đỡ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.